31

Selenium WebDriver に問題があります。ウィンドウ ページの外にあるリンクをクリックしようとしました (表示するには上にスクロールする必要があります)。私の現在のコードはかなり標準的です:

menuItem = driver.findElement(By.id("MTP"));
menuItem.click();
// I also tried menuItem.sendKeys(Keys.RETURN);

上にスクロールできることはわかっていますが、この場合はうまくいきます。しかし、アイテムのリストが長い場合、どこまでスクロールすればよいか分からない場合があります。

ページの表示部分にないリンクをクリックする方法はありますか (ただし、スクロールすると表示されます)。

ちなみに、私はFirefoxを使っていますが、IE7/8/9とChromeも使う予定です。

どんな助けでも大歓迎です。

編集:私が働いている会社がソースコードを許可していないため、残念ながらソースコードを提供できませんが、クリックしたいリンクのコードを提供できます。

<div class="submenu">
  <div id="MTP">Link title</div>
</div>

リンクが表示されている場合はまったく同じコードが機能し、表示されていない場合にのみ機能しません。

Edit2: 実際には、奇妙なことに、例外は発生せず、次の命令に進みます。基本的に、何が起こるかは次のとおりです。

menuItem = driver.findElement(By.id("MTP")); // no exception
menuItem.click();  // no exception
//... some code ensuring we got to the next page: timeout reached
driver.findElement(By.id("smLH")).click(); // NoSuchElementException, as we're on the wrong page.
4

11 に答える 11

18

要素に自動的にスクロールすることは実際に可能です。この場合、これは適切な解決策ではありませんが (スクロールせずに機能させる方法が必要です)、回避策として投稿します。誰かがより良いアイデアを思いつくことを願っています...

public void scrollAndClick(By by)
{
   WebElement element = driver.findElement(by);
   int elementPosition = element.getLocation().getY();
   String js = String.format("window.scroll(0, %s)", elementPosition);
   ((JavascriptExecutor)driver).executeScript(js);
   element.click();
}
于 2012-08-20T17:32:13.523 に答える
13

これと同じ回答を別の質問に投稿したので、これは単なるコピー アンド ペーストです。

私はかつて、拡大する必要があるビューにないコンボ ボックスを持っていました。moveToElement() 関数はオブジェクトを自動的にスクロールして表示するため、Actions ビルダーを使用しました。その後、クリックできます。

WebElement element = panel.findElement(By.className("tabComboBoxButton"));

Actions builder = new Actions(this.driver);

builder.moveToElement(element);
builder.click();
builder.build().perform();

(パネルは、POM で単にラップされた要素です)

于 2014-08-11T13:16:21.417 に答える
12

スクロールバーをボタンの位置に移動する代わりに、それが機能しないことがありましたが、Enterキーをボタンに送信しました

var element = driver.FindElement(By.Id("button"));
element.SendKeys(Keys.Enter);
于 2016-10-07T13:17:43.747 に答える
4

ヘッダー要素またはフッター要素が、アクションを実行する要素のビューをブロックしている可能性があるために発生している可能性があります。要素に対して何らかのアクションを実行する必要がある場合、Selenium は要素の位置にスクロールしようとします (私は Selenium WebDriver v3.4.0 を使用しています)。

ここに回避策があります -

private WebElement scrollToElementByOffset(WebElement element, int offset) {
    JavascriptExecutor jse = (JavascriptExecutor) driver;
    jse.executeScript("window.scrollTo(" + element.getLocation().getX() + "," + (element.getLocation().getY()
            + offset) + ");");

    return element;
}

上記の関数は、ビューを要素までスクロールし、指定したオフセットだけさらにスクロールします。そして、次のようにしてこのメ​​ソッドを呼び出すことができます-

WebElement webElement = driver.findElement(By.id("element1"));
scrollToElementByOffset(webElement, -200).click();

さて、これは単なる回避策です。この問題に対するより良い解決策を喜んで歓迎します。

于 2017-05-23T16:33:20.720 に答える
3

このソリューションは私にとって魅力のように機能しました:

public void click(By by) throws Exception{
    WebElement element = driver.findElement(by);
    ((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(true);", element);
    Thread.sleep(500);
    element.click();
}
于 2013-10-22T20:52:30.467 に答える
1

これは私にとってはうまくいきます(C#で)-

item = driver.findelement(by.....);
item.SendKeys(Keys.LeftControl);
item.Click();
于 2016-09-30T15:22:10.490 に答える
0

以下の方法を使用して、Selenium Java の同様の問題を解決しました。

public static void scrollToElementByElement(WebElement element) {

    Coordinates coordinates = ((Locatable)element).getCoordinates();
    coordinates.inViewPort();
    coordinates.click(); //if needed

}

次に、メインのテスト クラスのメソッドを呼び出します

于 2016-08-08T13:19:02.510 に答える