JavaScript webdriver-selenium `mouseMove` 在 Chromium 上不准确?

JavaScript webdriver-selenium `mouseMove` inaccurate on Chromium?

运行 Chromedriver 通过 NodeJs - protractorselenium-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]
    });

这已作为错误报告给 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();
});

希望对您有所帮助....