4

我在 Linux Xubuntu 13.10 上使用 Firefox 28.0 运行最新的 selenium 2.41

我试图让 FirefoxDriver 将鼠标移到页面上(在我的测试中,我使用了有线网页,它有很多悬停激活的菜单),但是moveByOffset鼠标没有做任何明显的事情,在全部:

package org.openqa.mytest;

import java.util.List;
import java.io.File;
import java.lang.*;

import org.openqa.selenium.By;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.*;
import org.openqa.selenium.firefox.*;
import org.openqa.selenium.firefox.FirefoxDriver;

import org.openqa.selenium.interactions.*;

import org.apache.commons.io.FileUtils;

public class Example {
    public static void main(String[] args) throws Exception {
        // The Firefox driver supports javascript 
    FirefoxProfile profile = new FirefoxProfile();
    profile.setEnableNativeEvents(true);
        WebDriver driver = new FirefoxDriver(profile);

        // Go to the Google Suggest home page
        driver.get("http://www.wired.com");

    File scrFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
        // now save the screenshto to a file some place
        FileUtils.copyFile(scrFile, new File("./screenshot.png"));


    Actions builder = new Actions(driver);
    Action moveM = builder.moveByOffset(40, 40).build();
    moveM.perform();

    Action click = builder.click().build();
    click.perform();
    //click.release();

    Action moveM2 = builder.moveByOffset(50, 50).build();
    moveM2.perform();

    Action click2 = builder.click().build();
    click2.perform();
    //click2.release();

    Action moveM3 = builder.moveByOffset(150, 540).build();
    moveM3.perform();

    for( int i=0; i < 1000; i++)
    {
        moveM = builder.moveByOffset(200, 200).build();
        moveM.perform();
        Thread.sleep(500);
        moveM = builder.moveByOffset(-200, -200).build();
        moveM.perform();
        Thread.sleep(500);
    }
    //Action click3 = builder.click().build();
    //click3.perform();
    //click3.release();

    scrFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
        // now save the screenshto to a file some place
        FileUtils.copyFile(scrFile, new File("./screenshot2.png"));

        driver.quit();
    }
}

我期待鼠标在不同元素上移动并触发所有悬停动作,但什么也没发生

4

5 回答 5

2

moveByOffset类的方法Actions被破坏或已经被破坏。请参阅Selenium WebDriver 错误 3578

(该错误在此错误文档的后面几行中进行了描述)。

一个项目成员(barancev)声称这个错误应该已经用 Selenium 版本 2.42 修复了。

尽管如此,我在带有 Firefox 33.0 的 openSUSE 12.3 上运行的 2.44 版本中发现了同样的错误。moveToElement工作,moveToOffset不。

于 2014-11-20T20:48:53.340 回答
1

我也在努力让拖放工作。

如果拖动目标不可见,似乎硒有问题,因此需要滚动。

无论如何,这就是有效的(Java)代码。请注意,我在没有参数的情况下调用“release()” - 作为参数的可放置元素和可拖动元素都不适合我。除了“moveToElement(dropable)”对我不起作用,这就是我手动计算偏移量的原因。

public void dragAndDrop(WebElement dragable, WebElement dropable,
        int dropableOffsetX, int dropableOffsetY) {
    Actions builder = new Actions(driver);

    int offsetX = dropable.getLocation().x + dropableOffsetX
            - dragable.getLocation().x;
    int offsetY = dropable.getLocation().y + dropableOffsetY
            - dragable.getLocation().y;

    builder.clickAndHold(dragable).moveByOffset(offsetX, offsetY).release()
            .perform();
}
于 2015-06-19T09:26:53.723 回答
0

我也在为此苦苦挣扎,对我有用的解决方案如下,我们必须在 X 或 Y 坐标上加 1。

看起来 (x,y) 将我们带到了不可点击的元素边缘

下面为我​​工作

    WebElement elm = drv.findElement(By.name(str));

    Point pt = elm.getLocation();

    int NumberX=pt.getX();
    int NumberY=pt.getY();

    Actions act= new Actions(drv);
    act.moveByOffset(NumberX+1, NumberY).click().build().perform();

您甚至可以尝试在 y 坐标上添加 +1 也可以

   act.moveByOffset(NumberX+1, NumberY).click().build().perform(); 
于 2018-01-22T04:12:16.300 回答
-1

请尝试使用 moveToElement。它应该工作。

Actions action = new Actions(webdriver);
WebElement we = webdriver.findElement(By.xpath("<XPATH HERE>"));
action.moveToElement(we).moveToElement(webdriver.findElement(By.xpath("/expression-here"))).click().build().perform();
于 2014-03-28T05:01:35.677 回答
-1

我建议如果您的浏览器没有执行 movetoelement 并移动到偏移量,那么您为查找偏移量放置了错误的元素偏移量,您在 chrome 中使用坐标插件

于 2018-10-24T11:27:08.633 回答