web-dev-qa-db-ja.com

「要素が現在表示されていないため、Selenium Webdriverと対話できない可能性があります」を回避する方法

テストにSelenium webdriver 2.210 + Javaを使用しています。Gmailのすべてのメールを選択するためのサンプルコードがあります。 webdriverを介してURLを取得した後、5秒の遅延を置きます。このコードを遅延で動作させることは可能ですか?

    driver.get("https://mail.google.com/mail/u/0/?shva=1#all");
        delay(5);  ////*......Working fine without this...........*////
    driver.switchTo().frame(driver.findElement(By.id("canvas_frame")));
driver.findElement(By.xpath("//div[@class = 'T-Jo-auh']")).click();

前もって感謝します

15
hks1233

あなたは正しい要素を見ていると確信していますか?私は同様の問題を抱えていましたが、ページには2つの同様の要素があり、1つは表示され、もう1つは表示されていませんでした。 FindElement関数は、表示されていないものを返していました。

FindElementの代わりにFindElementsを使用し、Linqを使用して表示されたものを抽出することで、これを解決しました。

18
Kesty

問題に取り組むためにできることの要約を次に示します(分度器/ JavaScriptの例)。

  • ブラウザウィンドウを最大化する (Chrome + Macでは、現在のところ 別の方法で行う必要があります ):

    browser.driver.manage().window().maximize();
    
  • ロケーターに一致する他の要素がないことを確認します。このエラーは、実際には表示されないロケーターと一致する別の要素がある場合に発生する可能性があります。

  • 要素がクリック可能になるまで

    var EC = protractor.ExpectedConditions,
        Elm = element(by.id("myid"));
    
    browser.wait(EC.elementToBeClickable(Elm), 5000);
    
  • 要素のスクロール

    var Elm = element(by.id("myid"));
    browser.executeScript("arguments[0].scrollIntoView();", Elm);
    
  • クリック javascript経由

    var Elm = element(by.id("myid"));
    browser.executeScript("arguments[0].click();", Elm);
    
  • 要素に移動して、「ブラウザアクション」からクリックします。

    var Elm = element(by.id("myid"));
    browser.actions()
        .mouseMove(Elm)
        .click()
        .perform();
    
5
alecxe

または、Seleniumで提供されているJavascriptExecutorクラスを使用することもできます。その後、JavaScriptを実行してWebページ上のDOMを操作できます。

参照:: http://Selenium.googlecode.com/svn/trunk/docs/api/Java/org/openqa/Selenium/JavascriptExecutor.html

3
armeo

Seleniumは、非表示またはユーザーに表示されないWebElementsと対話しません。この場合、ユーザーのクリックがdiv要素または類似のものと相互作用することは珍しくありません。これは、実際には視覚的な目的で非表示になっている実際のボタンをトリガーします。ページのFirefoxのSelenium IDEの手順を実行することをお勧めします。「非表示」要素をクリックしたときに複数のイベントがトリガーされるかどうかを確認してください。複数の場合イベントは実際にトリガーされます。WebDriverコードでそれに合わせてください。

1
AndyPerfect

よくわかりませんが、すべてのwatir-webdriver要素には-(オブジェクト)wait_until_present(timeout = 30)メソッドがあります。

このステップがオプションの場合、可視性を確認する必要があります。

element = driver.findElement(By.xpath("//div[@class = 'T-Jo-auh']"));

if (element.isDisplayed()) {
  element.click();
}

私はJavaの第一人者ではないため、上記のコードはテストされていません。試してみてください。

1
GoobeMaster
JavascriptExecutor executor = (JavascriptExecutor)driver;
executor.executeScript("document.getElementById('id').setAttribute('visibility', 'true');");

driver.findElement(By.id("id")).click();

要素の可視性を変更することで、アクションを実行できます。 SeleniumまたはJavascriptExecutorのいずれかでクリックできます

0
pradeep

PhantomJSユーザーはmaximize-windowの回答を監視する必要があります。スクリーンショットが完全に表示されていることを示している場合でも、JavaScriptダイアログボックスがビューポートの外にあると考えられる可能性は十分にあります。はっきりと見えるので、ビューにスクロールするアクションは何も変更せず、他のすべてのアクションも役に立たない。 (MacOS Safariや古いChromeなど、WebKitエンジンをベースにした他のブラウザーも同様)

0

Selenium Webdriverを2.20.0にダウングレードしてみてください。

Ruby gemバージョン2.21.0および2.21.2で同様のエラーが発生しました。

私の場合、.Ajax呼び出しを介してボタンがページに追加された場合、Webドライバーは常にbutton.visible? = falseを返します。

私のテストは以前より長い時間動作し、関連するものは何も変更されていません。だから私はこれが現在のバージョンのwebdriverのバグだと思います。

0
Grimmo

奇妙ですが、Javaでブラウザーのサイズを明示的に設定する必要があります。

driver.manage()。window()。setSize(new Dimension(1000、800));

0
Vaibs

私の場合(PhantomJSDriverはc#でSelenium WebDriverから呼び出されました)、要素が表示されるのに十分な大きさのウィンドウサイズを設定する必要がありました。

driver.Manage().Window.Size = new Size(1000, 800);

私はここで問題を読んでいる回避策を発見しました: https://github.com/ariya/phantomjs/issues/11637

0
Matthew Lock

アプリケーションでjQueryを使用している場合は、JavaScriptを使用してクリックできます。 WebDriverが検索を拒否する要素をクリックするためのこの単純なヘルパーを作成しました。

public static void jqClick(String selector, JavascriptExecutor driver) {
    driver.executeScript("$('" + selector + "').click()");
}

「ドライバー」として、たとえばorg.openqa.Selenium.firefox.FirefoxDriverを使用できます。

これが私にとって有効な唯一の解決策でした。

0
raimohanska