web-dev-qa-db-ja.com

JavaでSelenium WebDriverを使用して特定のDIVをスクロールする方法は?

一部のWebElementsはWebDriverによって認識されません。WebDriverは、ブラウザーの表示領域に表示されない要素を見つけることができません。

WebDriverでWebElementを表示可能にするには、特定のdivで下にスクロールするためにブラウザーのビューでその要素を表示する必要があります!

Webページの特定の領域でアクション(スクロールしてクリック)を実行するにはどうすればよいですか。私はたくさん試しましたが、助けにはなりませんでした。

問題の解決にご協力ください。

26
pandiaraj

まず第一に、ここに投稿された答えのほとんどはトピックから外れています。私は今、Selenium 2とSelenium 3を使用していますが、Webドライバーはウィンドウスクロールを処理して要素を表示できます。

次のようなスニペットを投稿するすべての人に対して:

driver.execute_script('scrollBy(0, 250)')

あなたはまったく質問を得ません!

実際、スクロールハンドルのドラッグアクションを適切にシミュレートする方法はまだ見つかりませんでしたが、 この答え は有望なように思えますが、試しませんでした。

これまでのところ、個人的にこれを行うには2つの方法があります:

  1. つかいます Keys.ARROW_DOWN
  2. つかいます Keys.PAGE_DOWN

実際には、3番目の方法があります。APIを提供している場合は、Seleniumを放棄してWebサイトに連絡するだけです。

9
Junchao Gu

下へスクロール:

import org.openqa.Selenium.JavascriptExecutor;
WebDriver driver = new FirefoxDriver();
JavascriptExecutor jse = (JavascriptExecutor)driver;
jse.executeScript("scroll(0, 250)"); //y value '250' can be altered

スクロールアップする:

JavascriptExecutor jse = (JavascriptExecutor)driver;
jse.executeScript("scroll(250, 0)"); //x value '250' can be altered

ページの下部をスクロールします。

JavascriptExecutor jse = (JavascriptExecutor)driver;
jse.executeScript("window.scrollTo(0,Math.max(document.documentElement.scrollHeight,document.body.scrollHeight,document.documentElement.clientHeight));");

または

Actions actions = new Actions(driver);
actions.keyDown(Keys.CONTROL).sendKeys(Keys.END).perform();

スローモーションで下までフルスクロール:

for (int second = 0;; second++) {
    if(second >=60){
        break;
    }
    ((JavascriptExecutor) driver).executeScript("window.scrollBy(0,400)", ""); //y value '400' can be altered
    Thread.sleep(3000);
}

または

JavascriptExecutor jse = (JavascriptExecutor)driver;
for (int second = 0;; second++) {
    if(second >=60){
        break;
    }
    jse.executeScript("window.scrollBy(0,800)", ""); //y value '800' can be altered
    Thread.sleep(3000);
}

WebElementまで自動的にスクロールします。

Point hoverItem =driver.findElement(By.xpath("Value")).getLocation();
((JavascriptExecutor)driver).executeScript("return window.title;");    
Thread.sleep(6000);
((JavascriptExecutor)driver).executeScript("window.scrollBy(0,"+(hoverItem.getY())+");"); 
// Adjust your page view by making changes right over here (hoverItem.getY()-400)

または

((JavascriptExecutor)driver).executeScript("arguments[0].scrollIntoView();", driver.findElement(By.xpath("Value')]")));

または

WebElement element = driver.findElement(By.xpath("Value"));
Coordinates coordinate = ((Locatable)element).getCoordinates(); 
coordinate.onPage(); 
coordinate.inViewPort();
7
Rupesh Shinde

それを行う最も簡単な方法は、スクロールするJavascriptを実行する要素の上下です。

JavascriptExecutor jsExec = (JavascriptExecutor) driver;
jsExec.executeScript("document.getElementById('id').scrollDown += 100");
6
Marcelo Xavier
driver.get("http://www.***.com/");
driver.manage().window().maximize();
WebElement scroll = driver.findElement(By.id("someId"));
scroll.sendKeys(Keys.PAGE_DOWN);
3
Pavel Kononenko

JavascriptExceutorscrollIntoView()メソッドを使用して行う別の方法:

WebElement DIVelement = driver.findElement(By.xpath("xpath to div"));

JavascriptExecutor jse = (JavascriptExecutor)driver;
jse.executeScript("arguments[0].scrollIntoView(true)". DIVelement);
2
kushal.8

最初に要素を見つけるのではなくスクロールする必要があるので、以下のようにします:

document.getElementById("your div id").scrollTop(250);

上記の後、その特定のdivを見つけることができます。

以下を試すこともできます:

JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("javascript:window.scrollBy(250,350)");
1
Helping Hands

私の「回避策」は、要素のx座標とy座標によって位置までスクロールすることです。また、ヘッダー/フッターまたはその他の要素がスクロール先の要素の可視性をブロックしないように、yにオフセットを追加しました。

この質問の下に回答を投稿しました-

Selenium Webdriverはページ外のリンクをクリックできません

0
yuva

HTMLが次のようなものであると考えてください。

<div id="someId" class="className" style="position: relative; top: 0px; left: opx;>

stylediv属性を観察できます。上記の例ではpxであるtopの値をチェックします。

次のようなことを試してください:

$('.className').animate({top: "-60px"});

下にスクロールするのに役立ちます。 JavaScriptエグゼキューターなので、もちろん実装する必要があります。

0
Gaurav Lad

投稿された回答はどれも私にとってはうまくいきませんでしたが、 この投稿 に基づいたソリューションを見つけました。

((JavascriptExecutor) driver).executeScript(
    "arguments[0].scrollTop=arguments[1].offsetTop",
    divWithScrollbarElement,
    elementToScrollTo);

ここで、divWithScrollbarElementはスクロールしようとしているdiv要素であり、elementToScrollToは表示可能にしたい子要素です(この場合、実際は私がいた要素の親でした)最初に表示しようとしています)。 elementToScrollToが実際にまだDOMにない場合は、スクリプトを一度使用して可能な限り下にスクロールし、もう一度要素を読み込んでください。

0
Dave