JavaScript webdriver-selenium `mouseMove` 在 Chromium 上不准确?
JavaScript webdriver-selenium `mouseMove` inaccurate on Chromium?
运行 Chromedriver 通过 NodeJs - protractor
和 selenium-webdriver
- 针对 Windows 10.
上的嵌入式 Chromium
似乎使用 getLocation
returns 准确的位置,但是当我尝试让 WebDriver 将鼠标移动到这些位置时,鼠标不会到达那里——除非我将位置相乘大约 1.45。
这肯定不对吧?
这是多年来我第一次使用 Selenium,但我敢肯定我以前从未这样做过。
以下是代码的缩写,以及一些 webdriver 日志:
1.将鼠标移动到一个元素上,
1.按下鼠标按钮,
1.稍等待测试下的系统反应,
1.为被测系统稍微移动鼠标,
1.稍等,
1.移动到目标元素
1. 松开鼠标键。
只要我不做任何更改,并且只垂直移动,代码就可以工作。
如果我垂直移动,我看不到任何效果。
如果我 运行 在一个 Chromium window 中编码两次,在每个 运行 的开头加载测试文档,第二个 运行 会在文档加载时挂起。
var destLocation,
fromEl = $('elementA'),
destEl = $('elementB');
destEl.getLocation()
.then(() => {
browser.driver.actions()
.mouseMove( fromEl, {x: 10, y: 10} )
// 09:56:37.222 INFO - Done: [mousemove: 5 true]
.mouseDown( fromEl, {x: 10, y: 10} )
// 09:56:37.230 INFO - Done: [mousedown: no args]
.perform();
})
.then(() => {
browser.sleep(400);
})
.then(() => {
// Business logic requires this
browser.driver.actions().mouseMove( fromEl, {x:15, y:15} )
// 09:56:37.719 INFO - Done: [mousemove: 5 true]
.mouseDown()
// 09:56:37.726 INFO - Done: [mousedown: no args]
.perform();
})
.then(() => {
browser.sleep(400);
})
.then(() => {
browser.driver.actions().mouseMove( $('body'), destLocation ).perform();
// 09:56:38.209 INFO - Done: [mousemove: 9 true]
})
.then(() => {
browser.sleep(200);
})
.then(() => {
browser.driver.actions().mouseUp().perform();
// 09:56:38.425 INFO - Done: [mouseup: nothing]
});
- Selenium v2.52.0,Core v2.52.0。从修订版 4c2593c
构建
- 驱动程序信息:driver.version:RemoteWebDriver
- OS: Windows 10 10.0 amd64
- Java:甲骨文公司 25.91-b14
- chromedriver_2.21 和 chromedriver_2.15.322448 的行为似乎相同
- CEF 3.2454.1344.g2782fb8
- 铬 45.0.2454.101
- WebKit 537.36
- Java脚本 4.5.103.35
这已作为错误报告给 Chromium 团队,他们无法使用所有库的最新版本重现该问题。
您可以使用此代码在 selenium 中进行鼠标悬停 javascript:-
const actions = driver.actions({bridge: true});
var elem=await driver.findElement(By.id("myId"));
await actions.move({duration:5000,origin:elem,x:0,y:0}).perform();
此代码必须在使用 await 的异步函数内,否则要与 promise 一起使用,此代码可能会有所帮助:-
const actions = driver.actions({bridge: true});
driver.findElement(By.id("myId")).then((elem)=>{
actions.move({duration:5000,origin:elem,x:0,y:0}).perform();
});
希望对您有所帮助....
运行 Chromedriver 通过 NodeJs - protractor
和 selenium-webdriver
- 针对 Windows 10.
似乎使用 getLocation
returns 准确的位置,但是当我尝试让 WebDriver 将鼠标移动到这些位置时,鼠标不会到达那里——除非我将位置相乘大约 1.45。
这肯定不对吧?
这是多年来我第一次使用 Selenium,但我敢肯定我以前从未这样做过。
以下是代码的缩写,以及一些 webdriver 日志: 1.将鼠标移动到一个元素上, 1.按下鼠标按钮, 1.稍等待测试下的系统反应, 1.为被测系统稍微移动鼠标, 1.稍等, 1.移动到目标元素 1. 松开鼠标键。
只要我不做任何更改,并且只垂直移动,代码就可以工作。
如果我垂直移动,我看不到任何效果。
如果我 运行 在一个 Chromium window 中编码两次,在每个 运行 的开头加载测试文档,第二个 运行 会在文档加载时挂起。
var destLocation,
fromEl = $('elementA'),
destEl = $('elementB');
destEl.getLocation()
.then(() => {
browser.driver.actions()
.mouseMove( fromEl, {x: 10, y: 10} )
// 09:56:37.222 INFO - Done: [mousemove: 5 true]
.mouseDown( fromEl, {x: 10, y: 10} )
// 09:56:37.230 INFO - Done: [mousedown: no args]
.perform();
})
.then(() => {
browser.sleep(400);
})
.then(() => {
// Business logic requires this
browser.driver.actions().mouseMove( fromEl, {x:15, y:15} )
// 09:56:37.719 INFO - Done: [mousemove: 5 true]
.mouseDown()
// 09:56:37.726 INFO - Done: [mousedown: no args]
.perform();
})
.then(() => {
browser.sleep(400);
})
.then(() => {
browser.driver.actions().mouseMove( $('body'), destLocation ).perform();
// 09:56:38.209 INFO - Done: [mousemove: 9 true]
})
.then(() => {
browser.sleep(200);
})
.then(() => {
browser.driver.actions().mouseUp().perform();
// 09:56:38.425 INFO - Done: [mouseup: nothing]
});
- Selenium v2.52.0,Core v2.52.0。从修订版 4c2593c 构建
- 驱动程序信息:driver.version:RemoteWebDriver
- OS: Windows 10 10.0 amd64
- Java:甲骨文公司 25.91-b14
- chromedriver_2.21 和 chromedriver_2.15.322448 的行为似乎相同
- CEF 3.2454.1344.g2782fb8
- 铬 45.0.2454.101
- WebKit 537.36
- Java脚本 4.5.103.35
这已作为错误报告给 Chromium 团队,他们无法使用所有库的最新版本重现该问题。
您可以使用此代码在 selenium 中进行鼠标悬停 javascript:-
const actions = driver.actions({bridge: true});
var elem=await driver.findElement(By.id("myId"));
await actions.move({duration:5000,origin:elem,x:0,y:0}).perform();
此代码必须在使用 await 的异步函数内,否则要与 promise 一起使用,此代码可能会有所帮助:-
const actions = driver.actions({bridge: true});
driver.findElement(By.id("myId")).then((elem)=>{
actions.move({duration:5000,origin:elem,x:0,y:0}).perform();
});
希望对您有所帮助....