2012-11-27 4 views
6

初めてセレンテストを行っています。ホームページでは、AJAXをいくつか呼びます.Seleniumが要素のロードを待つようにしたいと思います。私はそれが動作するかわからないが、私はちょうどセレンとwaitForConditionを選択することができます入力します。Selenium waitForCondition

私は何を選んでも問題はありません。常に「偽」を返します。私は今、waitForConditionの場合でも動作しませんか?

どうすれば動作するのですか? このコードで何が間違っていますか?リターン " - それが "真"

private boolean isElementPresent(By by) { 
    try { 
     driver.findElement(by); 
     return true; 
    } catch (NoSuchElementException e) { 
     return false; 
    } 
} 

isElementPresent(By.xpath( "// * [@ ID = 'MyTableというの']"))を返す - 私は自分のクラスで実装する場合

selenium.waitForCondition("//input[@name='Report'", "3000"); 
selenium.waitForCondition("//*[@id='MyTable']", "3000"); 
selenium.waitForCondition("css=.someClass2", "3000"); 

true "

答えて

3

waitForConditionは、JavaScriptの呼び出し専用であり、要素の読み込みを待つためのものではありません。

isElementPresentには何もありません。私は要素が実際に画面上にロードされ、現在されている場合について、もう少し正確であると明示的に待機してそれを組み合わせるでしょう:

http://seleniumhq.org/docs/04_webdriver_advanced.html

+0

大丈夫、この作品を。 JAVAで使用するものの例を挙げてください。私は、これを使うたびに書く必要があるコードの多くだと思います。 WebElement myDynamicElement =(新しいWebDriverWait(ドライバ、10))。(新しいExpectedCondition (){ \t \t \t \t @Overrideまで \t \t \t \t公共WebElement適用(webdriverをd)は{ \t \t \t \t \t return d.findElement(By.id( "MyTable")); \t \t \t \t}}; ' – boje

+0

@Arran this solution働く私はそれを上書きしています。ソリューションのためのThanx。 – RNS

0

AaranがSelenium WebDriver waitsの正しいドキュメントにあなたを言及しました。

あなたはExpectedConditionsクラスについても書いていることがわかります。これには、ExpectedConditionsクラスの、ExpectedConditions.presenceOfElementLocatedである "is element present one"などの便利な実装がいくつか含まれています。ここで

は、それを使用しての例です:

WebDriver driver = new ChromeDriver(); 
driver.get("http://www.degraeve.com/reference/simple-ajax-example.php"); 

driver.findElement(By.name("word")).sendKeys("bird is the word");; 
driver.findElement(By.cssSelector("input[type='button']")).click(); 
WebDriverWait driverWait = new WebDriverWait(driver, 10); 
WebElement dynamicElement = driverWait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#result p"))); 
System.out.println(dynamicElement.getText()); 

あなたはそれがあまりにも冗長見つけた場合は、なぜあなたはそれをリファクタリングし、要素ロケータとwebdriverをを受け入れる機能、およびリターンを抽出しません。あなたは要素ですか?

ExpectedConditionインスタンスを受け入れるDriverWait.until()は、述語関数を渡す方法のように、クラスを介して行うか、ドキュメントの例では匿名のネストされたクラスを使用します.Javaでは関数を送信できません。

あなたが渡したExpectedCondition関数は、値を返します。これは、ある要素(またはWebDriverの他の値)の条件を待っている場合に便利な値を返します。コール。

+0

_ExpectedConditions_が何らかの理由で認識されません。テキスト:ExpectedConditionsを解決できません – boje

+0

何らかの理由で_org.openqa.selenium.support.ui.ExpectedConditions_がありません正しいjarファイルはどこにありますか?私はorg.openqa.selenium.support.ui.ExpectedConditionを持っています( "S"を出していない) – boje

+0

どのバージョンのセレンを使用していますか? 2.25.0でコードをテストしましたが、http://seleniumhq.org/download/からダウンロードできます。 –

1

あなたはこのようにそれを行うことができます。これは、30秒までロードされる要素を待ちます

selenium.waitForCondition("selenium.isElementPresent(\"//input[@name='Report']\")", "30000"); 

。これはあなた

new WebDriverWait(driver, 30).until(new ExpectedCondition<Boolean>() { 
public Boolean apply(WebDriver driver) { 
    JavascriptExecutor js = (JavascriptExecutor) driver; 
    return (Boolean) js.executeScript("return jQuery.active == 0"); 
} 

})のために働く

+0

これは機能しません。 @Arranによると、_waitForCondition_はJavascript呼び出し専用です。これはJAVAとIE8によって行われます。 – boje

+0

これはうまくいくはずです.Ajaxベースのアプリケーションをテストするために、私はいつもこのメソッドを好む。このリンクを参照してください。http://www.seleniumwiki.com/selenium-rc/using-selenium-waitforcondition/ –

1

希望。

これは、jQueryライブラリに30秒間アクティブなAJAX要求があるかどうかをチェックします。

2

C#

あなたはこのようにそれを行うことができます:あなたが条件のためにタイムアウト値を設定することができ、すべての

まず。

次に、この条件を使用できます。すべてのthats

var Wait = new WebDriverWait(GlobalDriver, TimeSpan.FromMinutes(1)); 
Wait.Until(ExpectedConditions.PresenceOfAllElementsLocatedBy(By.XPath("xPath")))); 

OR

Wait.Until(driver => driver.FindElement(By.XPath("xPath"))); 

0

は一度これを試してみてください:

await().atMost(10, SECONDS).until(() -> driver.findElements(By.id("elementId")).size() >1);