アプリケーションを自動化する Java Webdriver コードを作成しています。ページが読み込まれたかどうかを正しく確認するにはどうすればよいですか? このアプリケーションには、いくつかの Ajax 呼び出しもあります。
WebDriver の暗黙の待機を宣言しました。
Seleniumがあなたに代わってそれを行います。または、少なくともそれは最善を尽くします。時々それは不十分であり、あなたはそれを少し助ける必要があります。通常の解決策はImplicit Wait
、ほとんどの問題を解決することです。
自分が何をしているのか、そしてなぜそれをしているのかを本当に知っているなら、ページが完全にロードされているかどうかをチェックするジェネリックメソッドを書いてみることができます。ただし、すべてのWebおよびすべての状況で実行できるわけではありません。
関連する質問:Selenium WebDriver:JavaScript(JS)を含む複雑なページが読み込まれるのを待ちます。そこで私の答えを参照してください。
短いバージョン:あなたは決して確信が持てないでしょう。
「通常の」ロードは簡単です- document.readyState
。もちろん、これはSeleniumによって実装されます。問題なのは非同期リクエスト、AJAXです。これは、それが正常に実行されたかどうかがわからないためです。今日のほとんどのWebページには、永久に実行され、サーバーを常にポーリングするスクリプトがあります。
あなたができる様々なことは上のリンクの下にあります。または、他の人の95%のように、必要に応じてImplicit Wait
暗黙的にExplicit Wait
+を使用ExpectedConditions
します。
たとえば、クリックすると、ページ上の一部の要素が表示され、それを待つ必要があります。
WebDriverWait wait = new WebDriverWait(driver, 10); // you can reuse this one
WebElement elem = driver.findElement(By.id("myInvisibleElement"));
elem.click();
wait.until(ExpectedConditions.visibilityOf(elem));
シンプルなready2useスニペット、私にとって完璧に機能します
static void waitForPageLoad(WebDriver wdriver) {
WebDriverWait wait = new WebDriverWait(wdriver, 60);
Predicate<WebDriver> pageLoaded = new Predicate<WebDriver>() {
@Override
public boolean apply(WebDriver input) {
return ((JavascriptExecutor) input).executeScript("return document.readyState").equals("complete");
}
};
wait.until(pageLoaded);
}
最近、AJAX アプリケーション/RIA を扱っていたときに、同じ問題が発生しました。そして、約 90 秒の暗黙の待機を使用しました。要素が利用可能になるまで待機します...したがって、ページが完全に読み込まれることを確認するためにできることは、
ブールステートメントを追加し、条件 (要素の特定の部分) が存在するかどうかを確認して変数に割り当て、条件を確認し、それが true の場合にのみ、「必要なアクションを実行します!」... でこのようにして、両方の待機を使用できることがわかりました...
元:
@Before
{ implicit wait statement}
@Test
{
boolean tr1=Driver.findElement(By.xpath("xx")).isEnabled/isDisplayed;
if (tr1==true && ____)//as many conditions, to make sure, the page is loaded
{
//do the necessary set of actions...
driver.findElement(By.xpath("yy")).click();
}
}
お役に立てれば!!私にとっても、それは実装段階にあります...
基本的なアイデアを提供するためにコードスニペットを使用して、これを修正する方法を次に示します。
public class IFrame1 extends LoadableComponent<IFrame1> {
private RemoteWebDriver driver;
@FindBy(id = "iFrame1TextFieldTestInputControlID" ) public WebElement iFrame1TextFieldInput;
@FindBy(id = "iFrame1TextFieldTestProcessButtonID" ) public WebElement copyButton;
public IFrame1( RemoteWebDriver drv ) {
super();
this.driver = drv;
this.driver.switchTo().defaultContent();
waitTimer(1, 1000);
this.driver.switchTo().frame("BodyFrame1");
LOGGER.info("IFrame1 constructor...");
}
@Override
protected void isLoaded() throws Error {
LOGGER.info("IFrame1.isLoaded()...");
PageFactory.initElements( driver, this );
try {
assertTrue( "Page visible title is not yet available.",
driver.findElementByCssSelector("body form#webDriverUnitiFrame1TestFormID h1")
.getText().equals("iFrame1 Test") );
} catch ( NoSuchElementException e) {
LOGGER.info("No such element." );
assertTrue("No such element.", false);
}
}
/**
* Method: load
* Overidden method from the LoadableComponent class.
* @return void
* @throws null
*/
@Override
protected void load() {
LOGGER.info("IFrame1.load()...");
Wait<WebDriver> wait = new FluentWait<WebDriver>( driver )
.withTimeout(30, TimeUnit.SECONDS)
.pollingEvery(5, TimeUnit.SECONDS)
.ignoring( NoSuchElementException.class )
.ignoring( StaleElementReferenceException.class ) ;
wait.until( ExpectedConditions.presenceOfElementLocated(
By.cssSelector("body form#webDriverUnitiFrame1TestFormID h1") ) );
}
....