【问题标题】:Why do Selenium tests behave different on different machines?为什么 Selenium 测试在不同的机器上表现不同?
【发布时间】:2017-09-29 16:38:32
【问题描述】:

我在 Google 上找不到有关此主题的太多信息。下面,我提供了来自相同 Selenium 测试的三个结果。为什么在不同地方运行测试时会得到不同的结果?

信息:

所以我们的架构:Bitbucket、Bamboo Stage 1(构建、部署到 QA)、Bamboo Stage 2(启动 Amazon EC2 实例“测试”,针对最近部署的 QA 运行测试)

  • 使用 Chrome 网络驱动程序。
  • 对于所有三个变体,我使用部署我们的应用程序的相同 QA URL。
  • 我正在运行所有测试 Parallelizable per fixture
  • EC2 实例正在运行 Windows Server 2012 R2 并安装了 Chrome 浏览器
  • 我已确保测试解决方案已正确部署到 EC2“测试”实例。它确实是完全相同的解决方案并且可以正确构建。

首先,本地:

其次,来自 EC2 通过调用测试的 SSM 脚本: 请注意,PowerShell 脚本调用 nunit3-console.exe 就像在我的第三个示例中使用命令行一样。

最后,RDP 在 EC2 上并从命令行运行测试:

这让我很困惑......为什么 Selenium 在不同的机器上运行不同?

【问题讨论】:

  • 什么是失败/错误?
  • 视情况而定,有时它是 NoSuchElementException,有时它在应该为真时断言为假。结果并不一致。编辑:我确保我运行的是相同版本的 Chrome 浏览器。我认为这是浏览器问题。
  • 这可能是由于与延迟相比超时太低,或者由于缺少显式等待。也可能是浏览器启动时窗口太小。您必须进行调查才能找到原因。您的帖子中没有足够的信息来说明原因。
  • 而且很难判断窗口大小。从 powershell 脚本运行时,chrome 浏览器实例在后台运行。我什至看不到窗户。我等待设置以确保页面在任何操作之前已完全加载。我正在使用 POM 模型。这可以解释为什么我随机得到 NoSuchElementExceptions ......也许我需要在 window.maximize 之后添加一个显式等待。我会玩这个。
  • 我会尝试为窗口设置一个特定的大小,而不是调用最大化。您也可以尝试使用无头命令开关。

标签: powershell selenium amazon-ec2 nunit nunit-console


【解决方案1】:

这真的应该是一个评论,但我还不能评论所以...... 我对您正在测试的应用程序的了解不够肯定,但这似乎是我在测试我正在开发的应用程序时看到的。

我看到了两个问题。首先,Selenium 在创建元素之前对其进行检查。有时它可以工作,有时它会失败,这取决于测试运行时页面加载的速度。没有押韵或理由。其次,我正在测试的应用程序非常愚蠢。当您触摸一个字段,输入数据并移至下一个字段时,它有效地将所有可编辑字段发布回数据库并刷新所有字段。因此,Selenium 输入值,移动到下一个字段并弹出一个过时的元素错误或找不到元素错误,具体取决于它在后/刷新周期中尝试与元素交互的时间。

我找到的解决方案有点难看,我尝试了等待,但是因为它是相同的元素名称,它已经可见并且立即被抓取,这会返回一个陈旧的元素。结果,我发现的唯一一件事是,通过在调用之间使用显式等待,我可以让它始终如一地正确运行。下面是我对正在测试的应用程序所做的一个示例。 (我知道我可以压缩代码,我正在为我的公司编写样式手册)

Thread.Sleep(2000);
By nBaseLocator = By.XPath("//*[@id='attr_seq_1240']");
IWebElement baseRate = driver.FindElement(nBaseLocator);
baseRate.SendKeys(Keys.Home + xBaseRate + Keys.Tab);

如果这没有帮助,请告诉我们有关该应用程序及其运行方式的更多信息,以便我们帮助您找到解决方案。

【讨论】:

  • 我正在使用页面对象模型。所以元素是用过滤器找到的。 See POM in Selenium C# 但我不认为这是我的问题。这可能是 AWS SSM 在我的 EC2 实例上运行测试的方式。如果我在我的 EC2 上运行 powershell 脚本,那么测试通过......但是当我通过 SSM 运行它们时,它们会随机抛出错误。我已经运行了“Enable-PSRemoting -Force”并且我已设置为接收请求。有些测试确实成功了。他们必须打开一扇窗户,但他们工作得很好。所以我输了。
  • 使用 POM 应该不会导致问题。我正在重构我的代码以使用 POM。我要在这里冒险了。据我了解,Selenium 旨在复制与正在测试的 Web 应用程序的直接用户交互。基本上,它充当最终用户的代表。我想知道当你把它交给 SSM 运行时是否发生了一些奇怪的事情。我想知道,如果 SSM 的行为不像最终用户,那么它是否是您的 EC2 实例上的代理。现在我想知道如果您连接到应用程序的前端并直接从您的计算机进行测试会发生什么。
  • 我有。我设置了一个新的 IAM 角色并从我的本地计算机运行它们。失败。如果我在 EC2 上进行 RDP,则运行 PowerShell 脚本;测试运行得很好。它要么是 SSM 发送命令的运行方式,要么是 powershell 中的安全功能甚至阻止无头浏览器正常运行。我把睡眠全部放了。那没有帮助。它仍然随机抛出 NoElementException
  • 编辑:我把 Sleeps 全部放了。那没有帮助。它仍然随机抛出 NoElementException EDIT2:我可以 Assert.IsTrue 并且测试将通过,只有当我需要加载页面时。
【解决方案2】:

@Florent B. 谢谢!

编辑:这最终不起作用... 使用 powershell 脚本远程调用时,测试的运行方式仍然不同。 但是,测试在 ec2 实例和我的机器上都在本地正确运行。

因此,无头命令开关允许我在本地复制失败的测试。

接下来我发现在测试期间通过脚本在 EC2 实例上运行时使用了无头 chrome 浏览器...这是自动的,因此测试确实在运行并且错误有效。

最后,我发现屏幕尺寸确实是罪魁祸首,因为它被固定在 600/400(600/400?)的尺寸上

因此,经过多次尝试,Windows、C# 和 ChromeDriver 2.32 唯一可用的屏幕尺寸选项是在启动驱动程序时设置 webDriver 选项:

ChromeOptions chromeOpt = new ChromeOptions();
chromeOpt.AddArguments("--headless");
chromeOpt.AddArgument("--window-size=1920,1080");
chromeOpt.AddArguments("--disable-gpu");
webDriver = new ChromeDriver(chromeOpt);

完成编辑: 只是为了更新 屏幕尺寸足够大。

仍在尝试解决问题。还有其他人遇到过这个吗? AWS SSM 命令 -> Powershell -> 使用 Start-Process 运行 Selenium 测试 -> 由于 ElementNotFound 或 ElementNotVisible 异常,任何需要元素的测试都会失败。 使用 POM 进行测试。 C# 中的 FindsBy 过滤器没有找到元素。

在 EC2 上本地运行测试从 cmd、powershell 和 Powershell ISE 运行良好。

使用 AWS SSM 命令执行时,测试无法正常工作。找不到任何资源来解决问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-11
    • 2012-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-07
    相关资源
    最近更新 更多