web-dev-qa-db-ja.com

セレンでマウスを動かす方法は?

マウスがページ上を実際に移動したように見えるように、ランダムな曲線または放物線を横切るマウスの動きをシミュレートしようとしています。 Seleniumを使用すると、要素をクリックする方法しかわかりませんが、一部のWebサイトで実際のユーザーをシミュレートできません。計算したランダムな線に沿ってマウスを動かして、要素をクリックします。

7
User

ドキュメントは move_by_offset(xoffset, yoffset) 関数を使用できると言います。

1
Sait

Selenium Webdriverでは、「アクション」を使用してこれを行うことができます。 webDriverがSeleniumドライバのインスタンスであるとしましょう。ここにJavaのコードがあります:

    Actions action = new Actions(webDriver);

    // First, go to your start point or Element
    action.moveToElement(startElement);
    action.perform();

    // Then, move the mouse
    action.moveByOffset(x,y);
    action.perform();

    // Then, move again (you can implement your one code to follow your curve...)
    action.moveByOffset(x2,y2);
    action.perform();

    // Finaly, click
    action.click();
    action.perform();

すべての可能なアクション(ダブルクリック、ホールド...)についてこのURLを参照できます http://Selenium.googlecode.com/git/docs/api/Java/org/openqa/Selenium/interactions/Actions .html

1
Cedric

実際のところ、実際のユーザーの操作をWebdriverでWebドライバーでシミュレートすることは不可能です。これは、マウスが「目に見える」動きを実行しないためです:(。コードを渡してから、アクションをすべてのピクセルに通過させても、機能しません。

このようなコード(おそらく次のコードの障害)はうまく機能しません。試してみたところ、目に見えるマウスの動きはありませんでした。ところで、テストの結果、パラメーターを 'moveByOffset'に渡すと、x座標とy座標が「左上」ポイントで始まることがわかりました。最初に別の要素に移動する意味がないかもしれません。

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();
0
J.Lyu