10

テストで使用sleep()する以外に、フォーム送信 (POST) が完了するのを明示的に待ってからアサーションを続行するためのより良い戦略を誰かが知っているかどうか疑問に思っています。これは、phpunit を Facebookの php-webdriverと一緒に使用して、私のテストがどのように見えるかを非常に要約したバージョンです)。

function test_form_submission()
{   
    // setup
    $web_driver = new WebDriver();
    $session = $web_driver->session();
    $session->open('http://example.com/login');

    // enter data
    $session->element('css selector', 'input[name=email]')->value(array('value' => str_split('test@example.com')));
    $session->element('css selector', 'input[name=password]')->value(array('value' => str_split('testpassword')));

    // click button to submit form
    $session->element('css selector', 'button[name=submit]')->click();

    // How do I wait here until the click() above submits the form
    // so I can check that we correctly arrives at the destination below
    // without resorting to sleep()?

    // Confirm that login was successful because we landed on account page
    $this->assertSame('http://example.com/account', $session->url());

    // teardown
    $session->close();
}
4

4 に答える 4

20

Facebookの php-webdriverは 2013 年 6 月に書き直されました。このように簡単に URL を待つことができます。

// wait for at most 10 seconds until the URL is 'http://example.com/account'.
// check again 500ms after the previous attempt.
$driver->wait(10, 500)->until(function ($driver) {
  return $driver->getCurrentURL() === 'http://example.com/account';
})
于 2013-08-14T23:01:03.570 に答える
2

さて、これは非常に古い質問であることは知っていますが、Google で偶然見つけたので、これがまだ誰かにとって役立つことを願っています (おそらく OP でさえ? :-))。

Google Code で記事やメッセージをかなり検索して読んだ後、非常に見苦しいと思われる解決策を見つけましたが、実際には良い代替手段はありません。ここで、WebDriver がページがいつ読み込まれたかを検出できないことがわかります。したがって、待機に戻る必要があります。現在、OP は Facebook の PHP WebDriver を使用しています。これには待機ユーティリティが含まれていませんが、この維持された cloneを使用すると、WebDriverWait の実装が得られます。

ここで問題は、何を待つかです。URL が変更されるのを待つこともできますが、URL が既に変更されている場合はページがまだ読み込まれていない可能性があるため、これは決して信頼できる方法ではありません。次のオプション: ページ上にあることがわかっている要素が読み込まれるまで待ちます。それはうまくいきますが、より一般的なアプローチが必要な場合はどうでしょうか? 幸いなことに、上記のスレッドで非常に良いアイデアを読みました。両方のページにある要素 (フッターなど) が消えて再表示されるまで待つことができます。

私は今これを実装しましたが、うまくいくようです。以下の関数を渡すことができ$session、新しいページがロードされた場合にのみ返されます (または、少なくともフッターが再び利用可能になります)。

public static function waitForNextPage($pWDSession) {
    $aWait = new PHPWebDriver_WebDriverWait($pWDSession);
    // wait for footer to not be available anymore
    $aWait->until(
            function($pWDSession) {
                return (0 === count($pWDSession->elements(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "#footer,#mx-footer")));
            }
        );
    // wait for footer to be available again
    $aWait->until(
            function($pWDSession) {
                return (0 < count($pWDSession->elements(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "#footer,#mx-footer")));
            }
        );
}

明らかにセレクターを変更したり、他の要素を使用したりできますが、考え方は変わりません。

それが役立つことを願っています!乾杯!

于 2013-07-31T12:27:10.263 に答える
0

代わりに、次のページがロードされるまで待機するためにclick()を使用できるはずです。clickAndWait()

于 2013-01-22T20:38:30.323 に答える
0

を使用Implicit Wait and Explicit Waitして、特定の Web 要素がページに表示されるまで待機できます。定義できる待機期間は、アプリケーションによって異なります。

明示的な待機:

明示的な待機は、コード内で先に進む前に、特定の条件が発生するのを待機するように定義するコードです。条件が達成されると、待機が終了し、次のステップに進みます。

コード:

 WebDriverWait wait = new WebDriverWait(driver,30);
 wait.until(ExpectedConditions.visibilityOfElementLocated(By.id(strEdit)));

または

 WebElement myDynamicElement = (new WebDriverWait(driver, 30))
 .until(new ExpectedCondition<WebElement>(){
@Override
public WebElement apply(WebDriver d) {
    return d.findElement(By.id("myDynamicElement"));
}});

これは、TimeoutException をスローする前に最大 30 秒待機するか、要素が見つかった場合は 0 から 30 秒でそれを返します。デフォルトでは、WebDriverWait は正常に返されるまで 500 ミリ秒ごとに ExpectedCondition を呼び出します。成功した戻り値は、ExpectedCondition の型であり、他のすべての ExpectedCondition 型のブール型の戻り値は true または null ではありません。

アプリケーションの必要に応じて、ExpectedConditions クラスを使用できます。

暗黙の待機:

暗黙の待機とは、要素がすぐに利用できない場合に要素を見つけようとするときに、WebDriver に一定時間 DOM をポーリングするように指示することです。

コード:

 driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

覚えておくべきことの 1 つは、暗黙的な待機が設定されると、WebDriver オブジェクト インスタンスの存続期間中はそのままになることです。

詳細については、このリンクを使用してくださいhttp://seleniumhq.org/docs/04_webdriver_advanced.jsp

于 2013-01-23T04:09:53.503 に答える