如何在Selenium中移动鼠标?

时间:2015-08-23 14:12:50

标签: python selenium-webdriver phantomjs mousemove

我尝试在随机曲线或抛物线上模拟鼠标移动,因此看起来鼠标实际上在页面上移动了。使用Selenium,我只知道如何点击某个元素,但这并不能模拟某些网站上的真实用户。我希望鼠标沿着我计算的随机线移动,然后单击元素。

4 个答案:

答案 0 :(得分:1)

文档说您可以使用move_by_offset(xoffset, yoffset)函数。

答案 1 :(得分:1)

使用Selenium Webdriver,您可以使用" Actions"去做这个。让我们说webDriver是你的selenium驱动程序的实例,这里是Java中的一段代码:

public void roundRobin2(List<Jobs> jobs, int startSize) {
    double counter = 0;
    double compTime = 0;

    Deque<Jobs> uncompletedJobs = new LinkedList<>(jobs);
    while (!uncompletedJobs.isEmpty()) {
        Job job = uncompletedJobs.pop();
        int taskTime = job.jobTime >= 2 ? 2 : 1;
        job.jobTime -= taskTime;
        counter += taskTime;
        if (job.jobTime == 0) {
            compTime += counter;
        } else {
             uncompletedJobs.addLast(job);
        }
    }
    jobs.clear();
    System.out.println("\n\nAverage completion times: "+ compTime + "/" + startSize +" = " + ((compTime)/startSize));
}

您可以参考此网址了解所有可能的操作(双击,按住...) http://selenium.googlecode.com/git/docs/api/java/org/openqa/selenium/interactions/Actions.html

答案 2 :(得分:1)

Python代码如下所示(假设您的浏览器是Firefox):

driver = webdriver.Firefox(executable_path=driver_path)
action = webdriver.ActionChains(driver)
element = driver.find_element_by_id('your-id') # or your another selector here
action.move_to_element(element)
action.perform()

请注意,这不会移动您的物理光标,而只会移动Selenium的不可见光标。要查看其是否有效,元素必须具有“悬浮”效果。 另外,如果您已经将光标移到某个元素上并且想要相对重新定位它,则可以使用:

action.move_by_offset(10, 20)    # 10px to the right, 20px to bottom
action.perform()

或更短:

action.move_by_offset(10, 20).perform()

更多文档在这里: https://selenium-python.readthedocs.io/api.html

答案 3 :(得分:-1)

在我的测试之后,通过webdriver模拟真实用户在网站上的操作是不可能的。这是因为鼠标不会执行“可见”运动:(。即使您传递代码然后让动作遍历每个像素,它也不起作用。

这样的代码(可能是以下代码中的错误)将无法正常工作。我只是试一试,没有看到任何可见的鼠标移动。顺便说一句,测试后我发现,一旦你将参数传递给'moveByOffset',那么x和y坐标将以'left-top'点开始。也许没有必要首先转移到另一个元素。

WebElement element = new WebDriverWait(driver, 10).until(ec);

    //Get the postion of the element 
    Point point = element.getLocation();

    int x = point.x;
    int y = point.y;


    //Let mouse on anther element
    WebElement element1 = driver.findElement(By.xpath("//a[@cid='link25118']"));
    Point point1 = element1.getLocation();
    int x1 = point1.x;
    int y1 = point1.y;
    action.moveToElement(element1);
    action.perform();

    //Calculate offset
    int offsetX = x1 - x > 0 ? x1 - x : x- x1;
    int offsetY = y1 - y > 0 ? y1 - y : y - y1;


    //Use move by offset to simulate moving along the element, then click
    int offset = offsetX > offsetY ? offsetX : offsetY;
    for(int i=0; i< offset; i++) {

        Thread.sleep(1000);

        if( i == (offsetX > offsetY ? offsetY : offsetX)) {
            if(offsetX > offsetY) {
                action.moveByOffset((offsetX - offsetY) * (x1>x?1:-1), 0).perform();
            } else {
                action.moveByOffset(0, (offsetY - offsetX) * (y1>y?1:-1)).perform();
            }

            break;
        }

        if((x1 > x) && (y1 > y)) {
            //right down
            action.moveByOffset(1, 1).perform();
        } else if ((x1 > x) && (y1 < y)) {
            //right up
            action.moveByOffset(1, -1).perform();
        } else if((x1 < x) && (y1 < y)) {
            //left up
            action.moveByOffset(-1, -1).perform();
        } else if ((x1 < x) && (y1 > y)) {
            //left down
            action.moveByOffset(-1, 1).perform();
        }
    }

    action.click();