环境 :
包.json
"dependencies": {
"browserstack-local": "^1.3.7",
"config": "^1.28.1",
"uuid": "^3.1.0",
"webdriverio": "^5.7.15"
},
"devDependencies": {
"config": "^1.28.1",
"@wdio/cli": "^5.7.15",
"@wdio/local-runner": "^5.7.15",
"@wdio/mocha-framework": "^5.7.14",
"@wdio/sync": "^5.7.13"
}
WebdriverIO 的配置
exports.config = {
user: process.env.BROWSERSTACK_USERNAME || 'XXX',
key: process.env.BROWSERSTACK_ACCESS_KEY || 'YYY',
specs: [
'./test/specs/**/*.js'
],
// Patterns to exclude.
exclude: [
// 'path/to/excluded/files'
],
maxInstances: 10,
capabilities: [
// Chrome and all other browsers work fine
// {
// browser: 'Chrome',
// resolution: '1280x1024',
// os: 'Windows',
// os_version: '10',
// name: 'Chrome',
// project: 'TT UI',
// 'browserstack.networkLogs': true
// },
{
browserName: 'Edge',
browser_version: '18.0',
resolution: '2048x1536',
os: 'Windows',
os_version: '10',
name: 'Microsoft EDGE',
project: 'TT UI',
'browserstack.networkLogs': true
}
],
// Level of logging verbosity: trace | debug | info | warn | error | silent
logLevel: 'debug',
waitforTimeout: 10000,
connectionRetryTimeout: 90000,
connectionRetryCount: 3,
framework: 'mocha',
mochaOpts: {
ui: 'bdd',
timeout: 60000
}
}
描述错误
命令 browser.switchToFrame() 在 Microsoft Edge 版本 16、17 和 18 上不会切换到 iFrame。相同的命令和代码片段(请参阅重现部分)适用于 Chrome、FireFox、Safari 和 IE11。
再现
npm run test:local
请确保您的浏览器驱动程序已启动
npm run test:remote
请确保您已在 wdio.remote.conf.js 中插入了 BrowserStack user
和key
运行简单测试后,会在browser.switchToFrame(parentFrame)
处启动错误并显示以下消息ERROR webdriver: Request failed due to no such frame: The specified frame was not found in the current frame or window.
在 Edge 女士 - 最好是 BrowserStack 上,但这应该没有任何区别 - 运行命令browser.switchToFrame(element)
或browser.switchToFrame(element.elementId)
并且您遇到了在选项 1 中描述的相同错误
预期行为
预期的行为是能够切换到 iFrame 并能够在 MS Edge 上检索和定位其中的元素。
日志
控制台日志和 wdio 日志在这里共享gist
附加上下文
最初这个问题是在 Gitter 频道上提出的,今天与@christian-bromann 进行了讨论,他建议在这里创建一个更详细的问题。
请注意,我也检查了这个问题 3774,但它似乎无关,因为我在 GitHub 上共享的代码(请参阅上面的部分)在除 Edge 之外的所有浏览器上都能完美运行
@christian-bromann 我很高兴结束这个问题,因为有一个有效且经过测试的解决方法。
谢谢
我无法让这个解决方案为他工作。 我尝试直接在 switchToFrame 上使用类名,但仍然看到相同的问题The specified frame was not found in the current frame or window.
。 只是为了正确理解您的解决方法,我是否应该直接在browser.switchToFrame(id or classname)
给出类名或 ID。 那是对的吗?
更新:此解决方案适用于 chrome,即和边缘。 不适用于 safari
最有用的评论
我已经找到了基于以下两个问题的解决方法:
这适用于 Chrome、FireFox、Ms Edge、IE11 和 Safari,所有这些都在 BrowserStack 下
let iFrame = $('//*[@name="iFrameSelector"]');
if (browser.capabilities.browserName === "MicrosoftEdge") iFrame = "iFrameSelector";
browser.switchToFrame(iFrame)