NightwatchJS 和 WebdriverIO 有啥区别?
Posted
技术标签:
【中文标题】NightwatchJS 和 WebdriverIO 有啥区别?【英文标题】:What is the difference between NightwatchJS and WebdriverIO?NightwatchJS 和 WebdriverIO 有什么区别? 【发布时间】:2016-06-29 03:23:13 【问题描述】:正如标题所述,Nightwatch.js 和 Webdriver.io 有什么区别?
似乎它们具有相同的语法并且做几乎相同的事情。它们有何不同?
我需要在它们之间做出选择。
【问题讨论】:
【参考方案1】:这个问题已经成为许多网络自动化 POC 和/或 MVP 实施的真正岔路口。我不希望它指示错误的方向!
因此,我觉得它需要一个更全面的答案,范围更广(易于安装、依赖项、重要插件、服务、报告器、文档、支持和其他集成),并希望比接受的答案更主观的传递。
❒ TL;DR:(给懒惰的人!)
➮ 如果您是初学者,从 Web 自动化开始,或者您想 为中小型 Web 应用程序建立测试覆盖率, 然后选择两者中的任何一个!(还不如掷硬币!)两者之间的差异非常小等级。 只有当你遇到更复杂的挑战时,裂缝才会变成差距。
➮ 如果您正在考虑构建 一个成熟的重量级 自动化工具以确保大型企业网络应用程序或大型门户网站的质量,然后阅读整篇文章(或接受我的建议并使用 WDIO! )
❒ 凭据:(什么建议我在这方面有发言权?)
自 2013 年初以来,我一直在广泛使用 基于 NodeJS 的测试框架,担任过从入门级到高级到 QA 主管的各种 QA 自动化工程角色。我将总结我在这些框架和网络自动化方面的工作经验:
WebdriverIO(+4 年) 守夜人(+2 年) 使用这些工具构建、维护和扩展多个框架,确保所有主要浏览器和环境(桌面和移动)的质量 在各种聚会/会议上进行了多次 WebdriverIO 和 NightwatchJS 演讲和演示 相当熟悉整个 NodeJS 测试环境(除了 WebdriverIO 和 Nightwatch,还使用过:WebdriverJS(WebdriverIO 的原始分支)、Nightmare、Robot 和最近,Puppeteer em>)。❒ 建议:如果您必须在两者之间进行选择以实施 POC,我建议您通读整个答案。只有这样,您才能对整个画面有一个完整的看法。
❒ 项目详情:
.-------------.---------.-----------.----------.-------------.--------------.
| project | ⭐️stars | ??forks | ?issues| ? open PRs | ? updated |
:-------------+---------+-----------+----------+-------------+--------------:
| webdriverio | 5050 | 1450 | 68 | 6 | 12.Jul.2019 |
:-------------+---------+-----------+----------+-------------+--------------:
| nightwatch | 9450 | 930 | 116|⁺306| 15 | 01.Jul.2019 |
'-------------'---------'-----------'----------'-------------'--------------'
+ - 第二个值表示未解决问题(open
标签)和陈旧问题的总和>(stale
标签,238 of them)。如果您很好奇,(我知道我是!)stale
表示使用机器人为打开一段时间不活动的工单提供的标签。 (这很可疑!)
❖ 浅尝辄止:(这是对上述数字的个人解释,因此请持保留态度)
➮ ( ?Strength ) NightwatchJS 是更广泛使用的解决方案(由 Github 明星总数强制执行的想法),整合后也迅速臭名昭著 并被几家大公司的 QA 团队宣传(例如: LinkedIn、AirBnB、GoPro 等)
➮ ( ?Strength ) 由于其稳健性、模块化和可扩展性,WebdriverIO 拥有更多的分叉。最近与许多流行和按需服务的集成(例如:ChromeDevTools、React 和 VisualRegression 插件)也增强了测试社区对解决方案的信任
➮ ( ?Weakness ) 尽管这不是针对技术的批评,但我最近对围绕 NightwatchJS 团队的持续不专业感到不满。所以,除了陈旧的票证,你可以不断地找到你完全有效的BUG,突然关闭,几乎没有信息。有时,你会得到一些有趣的东西,比如this。
➮ ( ?Opportunity ) 接下来的两个类别(Open Issues,Open PRs)实际上是 的真实形象commit-to-contributor ratio:NightwatchJS 主要由 Andrei Rusu 和少数其他人维护,而 WebdriverIO 作为主要贡献者 Christian Bromann 领导的项目脱颖而出,并得到一个非常活跃和活跃的社区的支持。
➮ ( ?Subjective ) 就我个人而言,我有时会觉得 Nightwatch 作为一个网络自动化框架,已经被半搁置了,主要贡献者 对来自users的generatingrevenue更感兴趣,而不是修复当前问题。不要误会我的意思...我并不反对营销和推销自己,但我更愿意将精力重新投入到产品和对活跃用户的尊重上,第一!
❒ 免责声明!
以下成绩 (
on a scale of 1-5 ⭐️
) 是我在广泛使用这两个框架后的个人评估。他们 除了我自己对给定的经验之外,不要反映任何其他内容 工具。
❒ 设置项目:
WebdriverIO (5/5 ⭐️
)
NightwatchJS (4.0/5 ⭐️
)
为此设置 WDIO、Nightwatch 或任何基于 NodeJS 的测试框架非常简单:
➊ 安装包:
npm install --save webdriverio
// or
npm install --save nightwatch
➋ 安装并启动 Selenium Server 包:
npm install --save-dev selenium-standalone
// don't forget to ...
cd ./node_modules/.bin
./selenium-standalone install
./selenium-standalone start
➌创建快速测试文件夹结构:
./
├── /test
| ├── /features (test-files go here)
| | └── test.js (your first test here)
| ├── /pages (page-objects go here)
| ├── /assets (everything goes in here)
| └── /custom_commands (custom methods go here)
└── package.json
➍生成配置文件(wdio.conf.js
,或nightwatch.conf.js
):
➮ ( ?Strength ) 正是在这一点上,WebdriverIO 获得了优势,因为它开箱即用带有一个定制的命令行界面 向导,用于简单直接的配置
wdio.conf.js
文件(您可以通过wdio config
启动向导 命令)➮ 使用 Nightwatch,您必须从Getting Started 部分复制粘贴模拟
nightwatch.conf.js
文件➮ 并不是夜巡在这方面欠缺,只是我个人觉得在某些方面留有更多的解读空间 方面,例如哪些配置键是强制性的,什么是
nightwatch.json
和nightwatch.conf.js
有什么不同, 等等。似乎在阅读了初始配置之后 文档,我留下的问题多于答案。
❖ WebdriverIO 的 配置助手(CLI 向导):
❒ 编写和运行我们的第一个测试:
WebdriverIO (5/5 ⭐️
)
NightwatchJS (4.5/5 ⭐️
)
好的,您现在终于建立了您的项目,您已经检查了所有软件依赖项,现在不是编写我们的第一个测试的时候了。在当前步骤中,您的项目应如下所示:
./
├── /test
| ├── /features
| | └── test.js
| ├── /pages
| ├── /assets
| └── /custom_commands
├── wdio.conf.js or nightwatch.conf.js
└── package.json
我真的很喜欢并感谢 Nightwatch 和 WebdriverIO 在各自的主页上都有一些很好的、开箱即用的工作示例。 即插即用!
❖ NightwatchJS 示例:(测试 Google 对 Rembrandt 的搜索)
module.exports =
'Demo test Google' : function (client)
client
.url('http://www.google.com')
.waitForElementVisible('body', 1000)
.assert.title('Google')
.assert.visible('input[type=text]')
.setValue('input[type=text]', 'rembrandt van rijn')
.waitForElementVisible('button[name=btnG]', 1000)
.click('button[name=btnG]')
.pause(1000)
.assert.containsText('ol#rso li:first-child',
'Rembrandt - Wikipedia')
.end();
;
❖ WebdriverIO 示例:(测试 DuckDuckGo 搜索 WebdriverIO)
❯wdio-v5
示例:
describe('DuckDuckGo - Search Test, () =>
it('Should test the DuckDuckGo search page', async () =>
await browser.url('https://duckduckgo.com/');
await browser.setValue('#search_form_input_homepage', 'WebdriverIO');
await $('#search_button_homepage').click();
//
const title = await browser.getTitle();
assert.equal(title, 'WebdriverIO at DuckDuckGo', `Checking the title ...`);
);
);
❯wdio-v4
示例:
const webdriverio = require('webdriverio');
const options = desiredCapabilities: browserName: 'chrome' ;
const client = webdriverio.remote(options);
client
.init()
.url('https://duckduckgo.com/')
.setValue('#search_form_input_homepage', 'WebdriverIO')
.click('#search_button_homepage')
.getTitle().then(function(title)
console.log('Title is: ' + title);
// outputs: "Title is: WebdriverIO (Software) at DuckDuckGo"
)
.end();
当您想向某人展示快速测试框架部署或教授自动化课程并且您缺少一个工作示例来测试手头的工作时,这变得特别方便。
➮ ( ?Strength ) 在编写你的第一个测试之前,WebdriverIO 会给你一个决定。你想写你的代码吗 同步,还是异步?这提供了极大的灵活性,让您可以选择自己的方式 想要编写您的测试(使用
sync
标志)。❗注意: 这是
wdio-v4
的特定功能!新的 WebdriverIO 实现 (wdio-v5
) 侧重于测试编写的同步方法,同时利用后台的异步调用。 为了保持对旧版本的忠实表示,我将保留以下示例,尽管它们对wdio-v4
不再有效。
// By default WebdriverIO commands are executed in a synchronous way using
// the wdio-sync package. If you still want to run your tests in an async way
// e.g. using promises you can set the sync option to false.
sync: true,
❖sync: true
示例:
describe('DuckDuckGo - Search Test, () =>
it('Should test the DuckDuckGo search page', () =>
browser.url('https://duckduckgo.com/');
browser.setValue('#search_form_input_homepage', 'WebdriverIO');
browser.click('#search_button_homepage');
const title = browser.getTitle();
console.log('Title is: ' + title);
);
);
❖sync: false
示例:
describe('DuckDuckGo - Search Test, () =>
it('Should test the DuckDuckGo search page', () =>
return browser
.url('https://duckduckgo.com/')
.setValue('#search_form_input_homepage', 'WebdriverIO')
.click('#search_button_homepage')
.getTitle().then(function(title)
console.log('Title is: ' + title)
// outputs: "Title is: WebdriverIO (Software) at DuckDuckGo"
);
);
);
❒ 页面对象:
WebdriverIO (5/5 ⭐️
)
NightwatchJS (5/5 ⭐️
)
现在几乎不可能讨论 Web 自动化 并且不结束关于 page objects、它们的有用性、它们的实现或页面的激烈讨论一般的对象模型。
在我们深入研究如何在这两个 NodeJS 测试框架中实现页面对象之前,我觉得我们必须了解为什么?我们正在使用它们。
为什么?(我们为什么要使用页面对象?)
有句话说,不要重新发明***,所以我不打算这样做。 相反,我将引用 ThoughtWork 的 Martin Fawler 恕我直言,谁说得最好:
“当您针对网页编写测试时,您需要引用该网页中的元素才能单击链接并确定显示的内容。但是,如果您编写的测试直接操作 html 元素,您的测试对 UI 中的更改将很脆弱。页面对象使用特定于应用程序的 API 包装 HTML 页面或片段,允许您操作页面元素而无需在 HTML 中进行挖掘。"
什么?(页面对象为我们提供了什么?)
他们创建了关注点分离:test vs. page 他们创建了应用程序的高级抽象 它们(应该)包含有关页面的所有静态信息 它们提供了在不更改测试的情况下重新设计应用的能力 它们可以表示页面上的任何元素(对象)或整个页面本身
如何?(我们如何创建这样的页面对象?)
废话少说!让我们看看我们如何轻松实现一些 我们测试框架中的页面对象。
WebdriverIO 页面对象示例:
❖ page.js
(这是您的页面对象库)
export default class Page
open (path)
browser.url(path);
// !Note: if you want to make sure your page was completely
// loaded, then maybe add some logic to wait for
// document.readyState = "complete", or "interactive"
// Use a /custom_command for this! Go D.R.Y. principle! RAWWWWR!
❖ form.page.js
(这是一个登录表单页面对象示例):
import Page from './page'
class FormPage extends Page
//
// > define your elements here <
//
get username () return $('#username')
get password () return $('#password')
get submitButton () return $('#login button[type=submit]')
get flash () return $('#flash')
//
// > define or overwrite page methods here <
//
open ()
super.open('login')
submit ()
this.submitButton.click()
export default new FormPage()
NightwatchJS 页面对象示例:
❖ homepage.js
(这是一个主页页面对象示例):
const homepageCustomCommands =
checkHomePage: function()
this.api.perform((done) =>
//
// > do some homepage checks here <
//
);
return this;
;
const homepage =
url()
return `$this.api.globals.baseUrl/homepage`;
,
elements:
'generic': '#generic',
'elements': '#elements',
'gohere': '#gohere',
sections:
header:
selector: '#header',
elements:
'these': '#these',
'are': '#are',
'your': '#your',
'selectors': '#selectors'
,
,
footer:
selector: '#footer',
elements:
// > footer selectors go here <
,
,
,
commands: [homepageCustomCommands]
;
module.exports = homepage;
❒ 文档和支持:
WebdriverIO (5/5 ⭐️
)
NightwatchJS (3/5 ⭐️
)
NightwatchJS 和 WebdriverIO 在文档方面都有很好的支持:
❯ WebdriverIO:Getting Started | API DOCs | Gitter Chat
❯ NightwatchJS:Getting Started | API DOCs
➮ ( ?Strength ) 这两个项目都有非常干净且内容丰富的文档以及很好的示例
➮ ( ?Opportunity ) 作为评论,我有时会发现自己正在寻找解决一个或多个 Nightwatch 功能问题或框架限制的解决方案,只是在后面找到解决方案-alley gist 或死水博客。如果这样的答案和贡献(像功能 PR 提交保持开放)能够集中并记录在案,我会很好
➮ ( ?Weakness ) 我不知道 Nightwatch 缓慢的开发周期和对社区 BUG、功能的支持乏善可陈(充其量)的瓶颈在哪里-requests,甚至提交 PR。 在我看来,与围绕 WDIO 的充满活力的开发社区或乐于助人的 Gitter chat channel
相比,这更像是一个缺陷
❒待续……
❒ 报告
❒ CI/CD 系统集成
❒ 架构差异
【讨论】:
一个非常好的开始,一个彻底的、深思熟虑的答案。我将继续跟进,因为我对这个主题不了解,并且总是能够更好地理解我使用的工具。 不错的答案!我最终使用了 WebdriverIO,它产生了一个非常可爱的自定义报告器,可以记录失败测试的视频。看看这个! github.com/presidenten/wdio-video-reporter 一个非常详细和彻底的答案 - 真的很有帮助,谢谢。 @iamdanchiv,我不得不说我很惊讶你选择了每月收入不到 100 美元的 Carbon 广告。如果您认为我们的目的是从我们的用户那里获得收入,而忽略我们在框架中投入的所有工作,那么我认为您可能严重脱离了维护开源软件的现实。 OpenCollective 或 Github Sponsors 等平台专门用于使维护人员能够为其工作获得资金,但您似乎认为我们甚至不应该考虑这一点,除非我们首先得到用户(例如您自己)的验证。 @andreirusu,首先,我很惊讶你花时间挑选和回答你不同意的东西,也投了反对票。请注意,这是我对此事的个人看法,因此,我在答案的标题中添加了免责声明。您可以像其他人一样同意或不同意,并据此投票,这是您已经拥有的。恕我直言,说时间最好花在做一些富有成效的事情上。 (例如:花时间在产品上,让它在功能上如此完善,以至于像我这样的用户不会在其中发现漏洞)【参考方案2】:我已经多次使用这些工具编写了一个测试套件。
Webdriver.io 允许您“从头开始”编写测试用例,并且可以很好地控制报告,例如,使用 slack npm 和其他软件包与 slack 集成。您需要了解或快速学习 node.js。除了与桌面浏览器很好地配合外,它还与 Appium、android Studio 和 Xcode 很好地集成,因此您可以在本地 Android 模拟器和 ios 模拟器上运行自动化测试。您将需要安装这些东西并编写一些代码来告诉 Appium 要使用哪些驱动程序,并选择功能等。
Nightwatch 是一个相当广泛的解决方案,它使用迭代器在测试失败时自动重试多达 3 次。 Nightwatch 对与 SauceLabs 等 VM 工具的集成提供了不错的支持,因此理论上您可以针对 700 多种不同的平台/浏览器/版本组合运行测试用例而无需编写代码来管理每个驱动程序。 Nightwatch 为您处理启动和关闭 selenium。虽然这最后一个听起来非常令人印象深刻,但实际上要达到并保持该级别的测试覆盖率需要做很多工作。 Nightwatch 还具有相当内置的关注点分离,允许您定义自定义命令并在基本测试用例或单个测试中需要它们。您可以将测试的某些部分模块化并导入它们,这样您就不必不断地重写例如登录测试以供在多种情况下使用。此外,您可以使用自定义命令将选择器作为键值对导入。
用过每一个,我会这样总结:
webdriver.io:如果您正在寻找更多的控制,一个非常自定义的解决方案并且您不需要迭代器,并且您有足够的知识来编写代码来选择您的浏览器驱动程序、设置功能以及您希望对报告进行自定义控制。
Nightwatch:如果您只想快速开始编写测试,要知道在特定平台/浏览器/版本上运行它们相对容易,并且仍然可以让您非常灵活地扩展您的通过编写自定义命令进行测试。
目前的另一个选择是 Dalek.js,它具有 Nightwatch 的简单脚本创建,但没有所有的花里胡哨。
在运行 nightwatch 之前,您可以在 Magellan.json 文件中配置浏览器,然后在运行测试时调用浏览器或一组浏览器(“配置文件”)作为命令行参数,因此:
对于本地浏览器:
./node_modules/.bin/magellan --serial --browsers=chrome,firefox
假设您已经设置了一个 saucelabs 帐户并添加了您的用户名和访问密钥,您可以像这样调用浏览器配置文件:
./node_modules/.bin/magellan --serial --profile=myBrowsers
这假设您在 Magellan.json 文件中设置了一个名为 myBrowsers 的配置文件,如下所示:
"profiles":
"myBrowsers": [
"browser": "chrome_46_OS_X_10_10_Desktop" ,
"browser": "firefox_42_Windows_2012_R2_Desktop" ,
"browser": "safari_8_OS_X_10_10_Desktop" ,
"browser": "safari_7_OS_X_10_9_Desktop" ,
"browser": "safari_9_OS_X_10_11_Desktop" ,
"browser": "IE_10_Windows_2012_Desktop" ,
"browser": "IE_11_Windows_2012_R2_Desktop" ,
"browser": "chrome_45_OS_X_10_8_Desktop" ,
"browser": "chrome_45_OS_X_10_9_Desktop" ,
"browser": "chrome_45_OS_X_10_10_Desktop" ,
"browser": "chrome_45_OS_X_10_11_Desktop" ,
"browser": "chrome_46_OS_X_10_10_Desktop" ,
"browser": "chrome_45_Windows_10_Desktop" ,
"browser": "chrome_45_Windows_2003_Desktop" ,
"browser": "chrome_45_Windows_2008_Desktop" ,
"browser": "chrome_45_Windows_2012_Desktop" ,
"browser": "chrome_45_Windows_2012_R2_Desktop" ,
"browser": "chrome_46_Windows_10_Desktop" ,
"browser": "chrome_46_Windows_2003_Desktop" ,
"browser": "chrome_46_Windows_2008_Desktop" ,
"browser": "chrome_46_Windows_2012_Desktop" ,
"browser": "chrome_46_Windows_2012_R2_Desktop" ,
"browser": "firefox_42_OS_X_10_9_Desktop" ,
"browser": "firefox_42_Windows_2012_R2_Desktop" ,
"browser": "android_4_4_Linux_Samsung_Galaxy_S4_Emulator", "orientation": "portrait" ,
"browser": "ipad_8_4_iOS_iPad_Simulator", "orientation": "landscape",
"browser": "ipad_8_4_iOS_iPad_Simulator", "orientation": "landscape",
"browser": "ipad_9_0_iOS_iPad_Simulator", "orientation": "landscape",
"browser": "ipad_9_0_iOS_iPad_Simulator", "orientation": "portrait",
"browser": "ipad_9_1_iOS_iPad_Simulator", "orientation": "landscape",
"browser": "ipad_9_1_iOS_iPad_Simulator", "orientation": "portrait",
"browser": "iphone_9_1_iOS_iPhone_Simulator", "orientation": "portrait",
"browser": "iphone_9_1_iOS_iPhone_Simulator", "orientation": "landscape"
]
一些更有用(可选)的命令行参数:
切换 --serial 参数会导致测试执行被序列化,并具有更详细的测试体验,您可以在其中查看运行期间返回的错误。由于等待测试完成,它的运行时间也更长。
一旦您的测试用例适用于本地计算机上存在的浏览器,添加 --sauce 参数后,您就可以使用 Sauce Labs 支持的(当前)760 个浏览器。继续将其粘贴到终端并点击返回:
./node_modules/.bin/magellan --serial --list_browsers
对于您要测试的每个设备/浏览器,您只需在 执行脚本时,在 --browser= 之后将命令行选项列复制粘贴为逗号分隔值。注意:在没有 --sauce 的情况下运行时,您可以使用 --browser=chrome 或 --browser=chrome,firefox
BREAKING IT DOWN:
使用不带 --sauce 但带 --serial 的 nightwatch 是一种很好的入门方式。 在你的脚本上工作,直到你验证了你想要检查的东西,并且当你确信所有应该通过的测试,做,用酱实验室和你想要测试的主要浏览器运行它。一旦您确信涵盖了主要浏览器,您就可以在不使用 --serial 的情况下运行它以减少运行时间(在 Sauce Labs 上很有用,这需要花钱)。
但足够多的传教,您可以在这里找到您对 Saucelabs 的需求: https://wiki.saucelabs.com/display/DOCS/The+Sauce+Labs+Cookbook+Home
还有一个 Nightwatch 的样板示例来做典型的 hello world:try this boilerplater
更新:自发布此消息以来,人们提出的几点以及我想到的几点。
Webdriver.io:
由于没有迭代器,因此在测试执行期间从失败中恢复的能力较小,这意味着失败更加确定。因为这纯粹是异步的,所以您可能很难追踪故障的确切来源。 您可能最终还必须为您创建的任何数据创建单独的拆卸脚本,以避免在执行期间发生数据冲突。
守夜人.js: 由于迭代器允许您重试,您通常能够找到脚本失败的地方。这可以让您更快地找到缺陷,而不是专注于脚本失败的原因。关闭各个脚本也更容易。
更新 2:
对于 Nightwatch,较短的测试是有用的/鼓励的。因为迭代器在每次迭代执行前立即将测试文件读入内存,所以您可以非常在迭代执行之间编辑测试。让我换一种方式说: 您的守夜人套房:
test_1 starts
test_1 FAIL // because you made a trivial error in your test case
test-2 starts // while it is running, you make the change, save it
test-2 PASS
test_1 starts // the iteration starts * with your change! *
test_1 PASS
============= Suite Complete =============
Status: PASSED
Runtime: 2m 48.3s
Total tests: 2
Successful: 2 / 2
1 test(s) have retried: 1 time(s)
另一方面,使用 node/webdriver.io 设置 Slack webhooks 很容易。这意味着您可以设置 node/webdriver.io 测试以在完成时向 Slack 报告。客户对此表示赞赏,因为在构建完成后,他们很快就会看到自动化的结果,例如:
✅ [client/product name here] Sprint ##.#.# 使用 OS X Firefox 59.0.2 在 [server URL or IP address] 上传递的自动化测试
❌ [client/product name here] Sprint ##.#.# 在 OS X Firefox 59.0.2 [server URL or IP address] 上的自动化测试失败
更新 3(2017 年 8 月 6 日)
我又花了一年半的时间每天都在与这两者打交道,我想补充以下几点。
有类似数量的 NPM 包与每个包集成,但您会注意到 *** 关于 Nightwatch (4x) 的问题要多得多。我相信这是因为 Webdriver.io 更像是一种自己动手的自动化测试方法[这是我的观点,我欢迎反馈/回击]。那些使用它的人不会有关于如何使用它的问题,他们会有关于技术的具体问题。
对于拥有丰富的 Selenium IDE 和扎实的 javascript 经验的人来说,Nightwatch 将是一个更好的切入点。它有很多开箱即用的有用解决方案。我对 Dalek 的一点经验表明,这同样是一个不错的选择。
拥有更多 javascript 以及一些面向对象编程和 unix 经验的人可能会发现 Webdriver.io 更好。正如我目前正在做的那样,构建自己的自定义框架只是一个很好的选择。如果您可以设想您希望您的初始化、流程控制和报告如何工作,并且愿意投入大量资金,那就再合适不过了。
下面有人问我更喜欢哪个,到目前为止,我更喜欢 Webdriver.io 进行广泛的 e2e 测试。虽然我经常将个性化的 Nightwatch 存储库用于构建在我们平台之上的大多数客户工作,但随着我构建自己的 Webdriver.io 解决方案,这种情况可能会在不久的将来发生变化。
更新 4(2018 年 5 月 2 日)
更新了有关控制 Selenium 和浏览器驱动程序的清晰信息,并添加了有关使用 Appium 和 Xcode/Android Studio 的一些详细信息。
【讨论】:
我想补充一点,WebdriverIO 还支持 SauceLabs 并添加自定义命令。不过,我不遵循您所说的关于编写驱动程序的内容。我不熟悉 Nightwatch,但我知道对于 WebdriverIO,您只需在 wdio.conf.js 中设置 browserName 如果我从文档中理解正确的话,Nightwatch 还可以管理 Selenium 服务器,而 WebdriverIO 没有 @jrader 我不知道 wdio.conf.js 中的 WebdriverIO browserName。我去看看,谢谢。是的,Nightwatch 管理 Selenium 服务器的启动和关闭。因此,您将使用 nightwatch 命令词汇:请参阅 link 和 link 我尝试了 Nightwatch 并立即发现了一些不起作用的东西。然后我注意到 *** 上有许多未回答的问题,并意识到如果没有任何支持,这不是一个好的选择。 @QualiT 我最终使用了 WebdriverIO,它产生了一个非常可爱的自定义报告器,可以记录失败测试的视频。看看这个! github.com/presidenten/wdio-video-reporter以上是关于NightwatchJS 和 WebdriverIO 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章
Nightwatchjs:如何在不创建错误/失败/异常的情况下检查元素是不是存在