实习生真的能够 运行 使用任何 Selenium 服务吗?

Is the Intern really able to run on any Selenium service?

我已经为 the Intern 编写了一些功能测试,据说应该可以在 SauceLabs、BrowserStack、TestingBot、 我自己的 Selenium 网格上运行。

虽然相同的代码似乎并不适用于所有服务。我最初在 SauceLabs 上进行了功能测试,所以我正在使用该服务作为我的 "base",可以这么说。

在 BrowserStack 上,测试似乎失败了,因为命令执行得太快了。例如,我正在使用.pressKeys('TEST\nIN\nPROGRESS\n'),其中\n应该在页面上执行javascript以将前面的文本变成一个标签(比如这个问题的SO标签:[intern] [javascript] [testing]).

该命令应产生以下结果:

[TEST] [IN] [PROGRESS]

而是导致

[TESTIN] [PROGRESS]

导致我的断言失败。将 pressKeys 命令更改为

.pressKeys('TEST\n')
.sleep(500)
.pressKeys('IN\n')
.sleep(500)
.pressKeys('PROGRESS\n')

没有解决问题。测试会不一致地通过/失败,标签 有时 显示为 [TEST] [IN] [PROGRESS],有时显示为 [TESTIN] [PROGRESS].

另一个例子是,当我在 link 上 .click() 时,它不会总是等待下一页加载,即使之后有 .sleep() 命令。

关于 TestingBot,应用程序完全无法上传文件,我终究无法弄清楚如何启用所需的 file_watcher 服务。他们有一个 file upload example here,但我不知道如何配置实习生来为我做这件事。

难道实习生不应该为测试处理云提供商的这些差异吗?

是否有一些标准化的方式在实习生中编写我的测试,以便我可以在不更改测试本身的情况下更改我的云测试提供商?

应该可以针对任何云托管的 Selenium 提供程序 运行 相同的测试套件并让它们成功执行,但您必须做一些事情:

  1. 您需要确保已正确配置提供程序,以便它们都运行使用相同版本的 Selenium。这没有标准;每个提供者使用不同的密钥来决定要使用哪个 Selenium 版本 运行。查看每个提供商的文档以了解要使用的正确密钥。

  2. 您需要编写没有竞争条件的测试。您在这里描述的内容听起来像是一个经典的竞争条件,您正在执行一些异步完成的操作,因此只发生在特定时间段内执行操作的环境中。修改此特定测试使其具有 find timeout 然后尝试 find 您希望在按下 return 键时生成的元素应该是一个很好的解决方案,因为这将使您在不减慢测试速度的情况下等待必要的时间。

不幸的是,即使有这个建议,所有用于 Web 浏览器测试的云托管提供商都是垃圾,并且以一种随机导致测试中断的方式乱七八糟。 BrowserStack 是迄今为止最好的避免这种情况的方法,但即使他们不时做一些事情来破坏测试,这些测试在本地托管的 Selenium 安装中运行得非常好。

对于文件上传,如果 Intern 检测到远程提供商支持文件上传,并且您 type 服务器上文件的有效路径 intern-runner 是 运行宁。您可以通过查看 this.remote.session.capabilities.remoteFiles 来检查服务器是否支持上传。必须打开功能检测才能使其工作,如果您尝试将文件上传到与 intern-runner.[=16 同一台机器上的 Selenium 服务器,您应该 运行 Intern 3.0.6 或更新版本=]