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

问题描述 投票:0回答:2

通过NodeJs运行Chromedriver - protractorselenium-webdriver - 针对Windows 10上的嵌入式Chromium。

似乎使用getLocation返回准确的位置,但是当我尝试让WebDriver将鼠标移动到那些位置时,鼠标不会到达那里 - 除非我将位置乘以大约1.45。

当然那不可能是对的吗?

这是我多年来第一次使用Selenium,但我确信我之前没有这么做过。

下面是代码的缩写,带有一些webdriver日志:1。将鼠标移动到一个元素,1。按下鼠标按钮,1。稍等片刻,系统下测试反应,1。移动鼠标稍微为被测系统,1。稍等一下,1。移动到目标元素1.释放鼠标按钮。

如果我什么都不做改变,代码就可以工作,只能垂直移动。

如果我垂直移动,我认为没有效果。

如果我在一个Chromium窗口中运行代码两次,在每次运行开始时加载测试文档,则第二次运行会挂起文档加载。

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 v​​2.52.0,Core v2.52.0。根据修订版4c2593c建造
  • 驱动程序信息:driver.version:RemoteWebDriver
  • AS:反向10 10.0 amd64
  • Java:Oracle Corporation 25.91-b14
  • chromedriver_2.21和chromedriver_2.15.322448似乎以同样的方式行事
  • CEF 3.2454.1344.g2782fb8
  • 铬45.0.2454.101
  • WebKit 537.36
  • JavaScript 4.5.103.35
selenium-webdriver webdriver selenium-chromedriver chromium-embedded
2个回答
1
投票

您可以在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();
});

希望能帮助到你....


0
投票

这是向Chromium团队报告的一个错误,他无法使用所有库的最新版本重现该问题。

© www.soinside.com 2019 - 2024. All rights reserved.