【问题标题】:Is the Intern really able to run on any Selenium service?实习生真的可以在任何 Selenium 服务上运行吗?
【发布时间】:2015-10-30 15:36:52
【问题描述】:

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

虽然相同的代码似乎不适用于所有服务。我最初在 SauceLabs 上进行了功能测试,所以可以说,我将该服务用作我的“基础”。

在 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]

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

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

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

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

【问题讨论】:

    标签: javascript testing automated-tests intern


    【解决方案1】:

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

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

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

    不幸的是,即使有这个建议,所有用于 Web 浏览器测试的云托管提供商都是垃圾和乱七八糟的东西,随机导致测试中断。 BrowserStack 在避免这种情况方面是迄今为止最好的,但即使它们有时也会破坏测试,而这些测试在本地托管的 Selenium 安装中运行良好。

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

    【讨论】:

    • 关于比赛条件,这正是这里发生的事情。查找超时并不能解决我在返回键未注册时遇到的问题——我需要真正减慢命令的速度,sleep() 似乎没有这样做。
    • 如果您显示整个测试而不是仅显示测试的这一部分,如果该建议不起作用,这可能会有所帮助,因为在 OP 中未表示的代码中可能存在次要问题。
    • 我创建了一个 codepen,其中包含有问题的完整失败测试。
    • 粘贴的代码没有按照我的建议做。它应该将“TEST\n”、“IN\n”和“PROGRESS\n”分成 3 个单独的类型命令。在每个之后,插入一个find 调用,以查找一旦按下回车键就应该生成的元素。这样,在正确生成第一个元素之前,您不会开始输入第二个元素。顺便说一句,这可能表明您的代码在快速打字员的控制下会失败,尽管我无法确定无法访问代码本身。
    • 哦!我明白你所说的find 命令是什么意思——我原以为你希望我找到我已经在其中的输入,而不是使用标签创建的 HTML 元素。这很有意义。最后一个问题——有没有办法摆脱 URL 点击的竞争条件?查找超时是否解决了这个问题?
    猜你喜欢
    • 1970-01-01
    • 2020-08-05
    • 2016-03-07
    • 1970-01-01
    • 2016-02-23
    • 1970-01-01
    • 2016-08-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多