マウスがページ上を実際に移動したように見えるように、ランダムな曲線または放物線を横切るマウスの動きをシミュレートしようとしています。 Seleniumを使用すると、要素をクリックする方法しかわかりませんが、一部のWebサイトで実際のユーザーをシミュレートできません。計算したランダムな線に沿ってマウスを動かして、要素をクリックします。
ドキュメントは move_by_offset(xoffset, yoffset)
関数を使用できると言います。
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
実際のところ、実際のユーザーの操作を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();