我正在为 Angular 单页面应用程序编写一个简单的硒自动化,并集成了浏览器堆栈。该代码在本地运行良好,并且适用于以下平台的 browserstack。
- os: OS X
osVersion: Big Sur
browserName: Safari
browserVersion: 14.1
- os: Windows
osVersion: 10
browserName: Edge
browserVersion: latest
- deviceName: Samsung Galaxy S22 Ultra
browserName: chrome # Try 'samsung' for Samsung browser
osVersion: 12.0
- deviceName: Google Pixel 7
osVersion: 13.0
browserName: chrome
deviceOrientation: landscape
但不适用于 iPhone。
- deviceName: iPhone 14
osVersion: 16
browserName: safari
deviceOrientation: portrait
这是代码。
var act = new Actions(driver);
var target = driver.findElement(By.cssSelector("[aria-label=\"nav-search-btn\"]"));
target.click();
act.moveToElement(target).build().perform();
iPhone 的错误是
The element identified by "5001" is either not present or it has expired from the internal cache. Try to find it again For documentation on this error, please visit: https://selenium.dev/exceptions/#stale_element_reference Build info:
它表示元素 5001 不存在或已过期。但这不可能发生,因为我可以在上一行中单击它。
我还可以捕获发送到 browserstack 的内部 API 调用。
这是为了点击,效果很好。
POST /session/xxx/element/5002/click {
"id": "5002"
}
这是用于 moveToElement 的。
POST /session/xxx/actions -- {
"actions": [
{
"id": "default mouse",
"type": "pointer",
"parameters": {
"pointerType": "mouse"
},
"actions": [
{
"duration": 100,
"x": 0,
"y": 0,
"type": "pointerMove",
"origin": {
"ELEMENT": "5002",
"element-6066-11e4-a52e-4f735466cecf": "5002"
}
}
]
}
]
}
似乎该问题仅发生在 moveToElement 和 iPhone 上。