一部のWebElementsはWebDriverによって認識されません。WebDriverは、ブラウザーの表示領域に表示されない要素を見つけることができません。
WebDriverでWebElementを表示可能にするには、特定のdivで下にスクロールするためにブラウザーのビューでその要素を表示する必要があります!
Webページの特定の領域でアクション(スクロールしてクリック)を実行するにはどうすればよいですか。私はたくさん試しましたが、助けにはなりませんでした。
問題の解決にご協力ください。
まず第一に、ここに投稿された答えのほとんどはトピックから外れています。私は今、Selenium 2とSelenium 3を使用していますが、Webドライバーはウィンドウスクロールを処理して要素を表示できます。
次のようなスニペットを投稿するすべての人に対して:
driver.execute_script('scrollBy(0, 250)')
あなたはまったく質問を得ません!
実際、スクロールハンドルのドラッグアクションを適切にシミュレートする方法はまだ見つかりませんでしたが、 この答え は有望なように思えますが、試しませんでした。
これまでのところ、個人的にこれを行うには2つの方法があります:
Keys.ARROW_DOWN
Keys.PAGE_DOWN
実際には、3番目の方法があります。APIを提供している場合は、Seleniumを放棄してWebサイトに連絡するだけです。
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);
}
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();
それを行う最も簡単な方法は、スクロールするJavascriptを実行する要素の上下です。
JavascriptExecutor jsExec = (JavascriptExecutor) driver;
jsExec.executeScript("document.getElementById('id').scrollDown += 100");
driver.get("http://www.***.com/");
driver.manage().window().maximize();
WebElement scroll = driver.findElement(By.id("someId"));
scroll.sendKeys(Keys.PAGE_DOWN);
JavascriptExceutor
のscrollIntoView()
メソッドを使用して行う別の方法:
WebElement DIVelement = driver.findElement(By.xpath("xpath to div"));
JavascriptExecutor jse = (JavascriptExecutor)driver;
jse.executeScript("arguments[0].scrollIntoView(true)". DIVelement);
最初に要素を見つけるのではなくスクロールする必要があるので、以下のようにします:
document.getElementById("your div id").scrollTop(250);
上記の後、その特定のdivを見つけることができます。
以下を試すこともできます:
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("javascript:window.scrollBy(250,350)");
私の「回避策」は、要素のx座標とy座標によって位置までスクロールすることです。また、ヘッダー/フッターまたはその他の要素がスクロール先の要素の可視性をブロックしないように、yにオフセットを追加しました。
この質問の下に回答を投稿しました-
HTMLが次のようなものであると考えてください。
<div id="someId" class="className" style="position: relative; top: 0px; left: opx;>
style
のdiv
属性を観察できます。上記の例ではpxであるtop
の値をチェックします。
次のようなことを試してください:
$('.className').animate({top: "-60px"});
下にスクロールするのに役立ちます。 JavaScriptエグゼキューターなので、もちろん実装する必要があります。
投稿された回答はどれも私にとってはうまくいきませんでしたが、 この投稿 に基づいたソリューションを見つけました。
((JavascriptExecutor) driver).executeScript(
"arguments[0].scrollTop=arguments[1].offsetTop",
divWithScrollbarElement,
elementToScrollTo);
ここで、divWithScrollbarElement
はスクロールしようとしているdiv要素であり、elementToScrollTo
は表示可能にしたい子要素です(この場合、実際は私がいた要素の親でした)最初に表示しようとしています)。 elementToScrollTo
が実際にまだDOMにない場合は、スクリプトを一度使用して可能な限り下にスクロールし、もう一度要素を読み込んでください。