为什么在移动仿真和多个浏览器量角器/Selenium网络驱动程序时得到"element not interactable"?



我有许多自动化的e2e测试,这些测试使用量角器和硒Web驱动程序(特别是chromderiver版本83(执行,如果配置设置为在桌面模式下使用chrome,或在移动仿真模式下使用单个实例,则可以正常工作。 当我配置为使用多个浏览器实例并且至少有一个处于移动仿真模式时,就会出现问题。 当我这样做时,我看到错误"元素不可交互"。

我的配置如下所示:

allScriptsTimeout: 60000,
SELENIUM_PROMISE_MANAGER: false,
baseUrl: testData.baseUrl,
seleniumAddress: "http://localhost:4444/wd/hub/",
specs: ["./src/**/*.spec.ts"],
multiCapabilities: [{
browserName: "chrome",
chromeOptions: {
args: ["--window-size=1900,1024"], // THIS!
},
specs: ["./src/**/*.desktopspec.ts"],
},
{
browserName: "chrome",
chromeOptions: {
mobileEmulation: {
deviceName: "Nexus 5",
},
args: ["--touch-events=enabled"],
},
specs: ["./src/**/*.mobilespec.ts"],
reportName: "nexus5",
},
{
browserName: "chrome",
chromeOptions: {
mobileEmulation: {
deviceName: "iPhone 6",
},
args: ["--touch-events=enabled"],
},
specs: ["./src/**/*.mobilespec.ts"],
}],
framework: "jasmine2",
jasmineNodeOpts: {
showColors: true,
defaultTimeoutInterval: 60000,
keepAlive: true,
print: function () {},
}

具体说来

  • 如果我注释掉nexus5和iPhone6,测试就会成功。
  • 如果我注释掉 nexus5 和 chrome(桌面(,测试就会成功。
  • 如果我注释掉iPhone6和chrome(桌面(,测试就会成功。
  • 如果我添加第二个 chrome(桌面(并注释掉两个移动模拟器,测试就会成功
  • 如果我添加第二个nexus5(或iPhone6(并注释掉其他变体,测试就会失败。

总之,如果我使用多个实例,其中任何一个实例使用移动仿真,那么测试将失败(对于移动仿真运行,但不适用于桌面运行(,并在第一次尝试单击时出现"元素不可交互"错误。

我尝试更改规格,以便移动运行使用点击功能browser.touchActions().tap(element).perform()但这并不能解决问题。

请有人建议为什么移动仿真只有在测试运行中唯一的浏览器实例时才会出现?

哦,这很简单。

许多网页是为不同的操作系统单独构建的。例如,一个应用程序可能有一组用于桌面浏览器的元素,另一组用于移动设备的元素。然后两组都有ng-if指令,上面写着"如果浏览器是chrome,则显示第一组"。例:

<html>
<body>
<div ng-if="$root.is_mobile">
<! rest of the content>
</div>
<div ng-if="$root.is_desktop">
<! rest of the content>
</div>
</body>
</html>

并且仅显示任一集。

因此,您已使用桌面特定元素的定位器编写了量角器测试。当您在移动设备中打开页面时,这些元素存在于 DOM 中,但被隐藏。这就是错误的本质含义 - 元素在页面上,但您如何与不可见的元素进行交互?..

附言实际上这是几个可能的原因之一,但最有可能的原因之一

相关内容

  • 没有找到相关文章

最新更新