セレンはドキュメントの準備ができるまで待機します


133

ページが完全に読み込まれるまでセレンを待機させる方法はありますか?汎用的なものが欲しいのですが、WebDriverWaitを構成して 'find'などを呼び出して待機させることはできますが、それほど遠くまでは行きません。ページが正常に読み込まれることをテストし、次のページに移動してテストするだけです。

私は.netで何かを見つけましたが、Javaでそれを動作させることができませんでした...

IWait<IWebDriver> wait = new OpenQA.Selenium.Support.UI.WebDriverWait(driver, TimeSpan.FromSeconds(30.00));
wait.Until(driver1 => ((IJavaScriptExecutor)driver).ExecuteScript("return document.readyState").Equals("complete"));

誰か考えはありますか?


なぜあなたは待機を使いたくないのですか?
Amey 2013

7
あなたは明示的な待機を意味しますか?時間のかかる作業です。1万ページをテストしています。
Girish 2013

2
つまり、多数のリンクをテストしている場合、修正待機を追加することは良い考えではないかもしれません。
Girish 2013

10
一定秒数待っても意味がありません。それは推測です。
アンデルスリンデン、2015年

ページのjavascriptが任意の汎用コードを実行できる場合、その完了を待機するプログラムを作成することは不可能です。これは停止問題の形式です(en.wikipedia.org/wiki/Halting_problem)。ここでのすべてのソリューションは、妥協するか、基礎となるWebページの前提に基づいている必要があります。
スピードプレーン2016年

回答:


83

このコードを試してください:

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

上記のコードは、ページの読み込みを最大10秒待機します。ページの読み込みが時間を超えると、がスローされTimeoutExceptionます。例外をキャッチして、ニーズに対応します。例外がスローされた後、ページの読み込みを中止するかどうかはわかりません。このコードはまだ試していません。試してみたいだけです。

これは暗黙の待機です。これを一度設定すると、Webドライバーインスタンスが破棄されるまでスコープが設定されます。

詳細については、ドキュメントをWebDriver.Timeouts参照してください。


3
おかげで、ページが10秒前に読み込まれた場合、ここで何が起こりますか?それでも、読み込み後に次の行が実行されるまで10秒待機しますか?
Girish 2013

ページが10秒前に読み込まれる場合は、待機条件が終了して前の行が実行されることを意味します。
Manigandan 2013

3
これは、ページの読み込みがタイムアウトして例外をスローするのに時間がかかりすぎることが予想される場合に使用されます。すぐにページの読み込みを待機したり、より適切な読み込みポリシーを設定したりしません。デフォルトでは無限に設定されているため、ページの読み込みで例外がスローされることはなく、Seleniumは常に読み込みが完了するまで待機します。
PetrJaneček2013

19
このメソッドの問題は、暗黙的な待機が以前に正常にWebElementオブジェクトを返したにもかかわらず、DOMに完全にアクセスできない可能性があることです。次に、要素をクリックしようとすると、古い要素の例外が発生します。したがって、この答えは完全に安全ではありません。
djangofan 2013年

3
このタイムアウトは、ドキュメントが読み込まれるのを待つこととどのように関連していますか?
アンデルスリンデン、2015年

90

提案されたソリューションは、DOMreadyStateが信号を送るのを待つだけcompleteです。しかし、デフォルトでは、Seleniumはdriver.get()およびelement.click()メソッドを介したページの読み込みでそれら(およびもう少し)を待機しようとします。彼らはすでにブロックしており、ページが完全に読み込まれるのを待っており、正常に動作しているはずです。

問題は、明らかに、AJAXリクエストと実行中のスクリプトを介したリダイレクトです。これらはSeleniumでキャッチできず、完了するまで待機しません。また、確実にそれらを介してキャッチすることはできませんreadyState-少し待つので便利ですが、completeすべてのAJAXコンテンツがダウンロードされるかなり前に信号を送ります。

どこでも、誰にとっても機能する一般的なソリューションはありません。そのため、それは難しく、誰もが少し違うものを使用しています。

一般的なルールは、WebDriverに依存して役割を果たし、暗黙の待機を使用し、ページでアサートする要素に対して明示的な待機を使用することですが、実行できるテクニックは他にもたくさんあります。テストしたページで、ケースに最適なもの(またはそれらのいくつかの組み合わせ)を選択する必要があります。

詳細については、これに関する私の2つの回答を参照してください。


20
これは不正確です。Seleniumはelement.click()呼び出しを待機したりブロックしたりしません。
hwjp 2014

3
@hwjpさらに詳しく説明しますか?JavaDocsはそうではないと言います「これにより新しいページが読み込まれる場合、このメソッドはページが読み込まれるまでブロックを試みます。」
PetrJaneček14年

5
メーリングリストで行ったいくつかの会話を参照してください。セレンは、明示的にURLを要求する.get呼び出しをブロックする可能性がありますが、「実際の」ハイパーリンクをクリックしたか、JavaScriptによってインターセプトされるハイパーリンクをクリックしたかどうかを判別できないため、クリック呼び出しでは特別なことはありません。 ..
hwjp

4
メーリングリストの議論の始めにバグにリンクします。でも、ドキュメントは言い紛らす: 「クリック()[...]意志*ない*待ち、その後メソッドをネイティブのイベントを送信することにより行われている場合は、」
hwjp

4
したがって、ブラウザが「ネイティブイベント」を使用しているかどうかがすべてオンになります。そして、それらのほとんどは、デフォルトで: code.google.com/p/selenium/wiki/… (したがって、これらのドキュメントはせいぜい誤解を招くものだと思います。メーリングリストにpingを送信します)のようです。
hwjp

61

これはあなたが与えた例の動作するJavaバージョンです:

void waitForLoad(WebDriver driver) {
    new WebDriverWait(driver, 30).until((ExpectedCondition<Boolean>) wd ->
            ((JavascriptExecutor) wd).executeScript("return document.readyState").equals("complete"));
}

c#の例:

public static void WaitForLoad(IWebDriver driver, int timeoutSec = 15)
{
  IJavaScriptExecutor js = (IJavaScriptExecutor)driver;
  WebDriverWait wait = new WebDriverWait(driver, new TimeSpan(0, 0, timeoutSec));
  wait.Until(wd => js.ExecuteScript("return document.readyState").ToString() == "complete");
}

1
おい、私はこれをコピー/貼り付けています。このスニペットは素晴らしいです。なぜ私はこれを考えなかったのですか?一対以上の眼球が常に良い解決策につながるという真実。ありがとう。
luis.espinal

2
ラムダ式がサポートしていないので、これをJava 1.7バージョンと互換性がありますか
vkrams

3
Java 1.7バージョン:wait.until(new Predicate <WebDriver>(){public boolean apply(WebDriver driver){return((JavascriptExecutor)driver).executeScript( "return document.readyState")。equals( "complete");} });
luQ 2016

1
誰かが@IuQによるソリューションを使用したい場合、Predicateはインポートされますimport com.google.common.base.Predicate
Knu8

VBテストアプリでこのアイデアを試しました。ほとんどの場合機能します。System.InvalidOperationException:JavaScriptエラー(UnexpectedJavaScriptError)at OpenQA.Selenium.Remote.RemoteWebDriver.UnpackAndThrowOnError(Response errorResponse)テストアプリがレベル2のメニューリンクをクリックしてから、WaitObj.Until(Function(D)DirectCast( D、InternetExplorerDriver).ExecuteScript( "return document.readyState")= "complete")。ブラウザが現在のページをアンロードし、ドキュメントオブジェクトではないため、エラーが発生したと思います。おそらく1/2秒待ってから「return document.readystate?Ideas?
CoolBreeze

12

これが、Pythonでの完全に一般的なソリューションでの私の試みです。

まず、一般的な「待機」関数(必要に応じてWebDriverWaitを使用してください。醜いものです):

def wait_for(condition_function):
    start_time = time.time()
    while time.time() < start_time + 3:
        if condition_function():
            return True
        else:
            time.sleep(0.1)
    raise Exception('Timeout waiting for {}'.format(condition_function.__name__))

次に、ソリューションは、セレンがトップレベルの<html>要素を含むページ上のすべての要素の(内部)ID番号を記録するという事実に依存しています。ページが更新またはロードされると、新しいIDを持つ新しいhtml要素が取得されます。

したがって、たとえば「my link」というテキストのリンクをクリックしたい場合は、次のようにします。

old_page = browser.find_element_by_tag_name('html')

browser.find_element_by_link_text('my link').click()

def page_has_loaded():
    new_page = browser.find_element_by_tag_name('html')
    return new_page.id != old_page.id

wait_for(page_has_loaded)

よりPythonicで再利用可能な汎用ヘルパーについては、コンテキストマネージャを作成できます。

from contextlib import contextmanager

@contextmanager
def wait_for_page_load(browser):
    old_page = browser.find_element_by_tag_name('html')

    yield

    def page_has_loaded():
        new_page = browser.find_element_by_tag_name('html')
        return new_page.id != old_page.id

    wait_for(page_has_loaded)

そして、ほとんどすべてのセレンの相互作用でそれを使用できます:

with wait_for_page_load(browser):
    browser.find_element_by_link_text('my link').click()

それは防弾だと思います!どう思いますか?

それについてのブログ投稿の詳細はこちら


非常に興味深いアプローチ。1つの課題は、ブラウザーが最初に起動された後、これが初期ページの読み込みで機能するかどうかです。ブラウザの初期状態にページが読み込まれているという保証はありません。また、Javaでは、オブジェクトに「id」があることはわかりません。セレンがhtml id属性を挿入することを意味しているのではないと思います。このオプションについてさらに調べたら、この応答にさらに追加します。投稿ありがとうございます!
Lukus、2015年

@hwjp私はこのソリューションを何度も使用して優れた結果を得ていますが、1つのケースでは機能しないようです。問題の完全な説明stackoverflow.com/q/31985739/4249707
El Ruso

7

同様の問題がありました。ドキュメントの準備が整うまで、そしてすべてのAjax呼び出しが終了するまで待つ必要がありました。2番目の状態は検出が困難であることが判明しました。最後に、アクティブなAjax呼び出しを確認しましたが、うまくいきました。

JavaScript:

return (document.readyState == 'complete' && jQuery.active == 0)

完全なC#メソッド:

private void WaitUntilDocumentIsReady(TimeSpan timeout)
{
    var javaScriptExecutor = WebDriver as IJavaScriptExecutor;
    var wait = new WebDriverWait(WebDriver, timeout);            

    // Check if document is ready
    Func<IWebDriver, bool> readyCondition = webDriver => javaScriptExecutor
        .ExecuteScript("return (document.readyState == 'complete' && jQuery.active == 0)");
    wait.Until(readyCondition);
}

document.readyState == 'complete' && jQuery.active == 0Reactのようなものはありますか?
Rain9333

7
WebDriverWait wait = new WebDriverWait(dr, 30);
wait.until(ExpectedConditions.jsReturnsValue("return document.readyState==\"complete\";"));

4

C#NUnitの場合、WebDriverをJSExecuterに変換してからスクリプトを実行し、document.ready状態が完了しているかどうかを確認する必要があります。以下のコードを参照して確認してください:

 public static void WaitForLoad(IWebDriver driver)
    {
        IJavaScriptExecutor js = (IJavaScriptExecutor)driver;
        int timeoutSec = 15;
        WebDriverWait wait = new WebDriverWait(driver, new TimeSpan(0, 0, timeoutSec));
        wait.Until(wd => js.ExecuteScript("return document.readyState").ToString() == "complete");
    }

これは、条件が満たされるかタイムアウトになるまで待機します。


3

最初のページの読み込みでは、ブラウザウィンドウを「最大化」すると、ページの読み込みが完了するまで(ソースを含む)実質的に待機することに気付きました。

交換:

AppDriver.Navigate().GoToUrl(url);

と:

public void OpenURL(IWebDriver AppDriver, string Url)
            {
                try
                {
                    AppDriver.Navigate().GoToUrl(Url);
                    AppDriver.Manage().Window.Maximize();
                    AppDriver.SwitchTo().ActiveElement();
                }
                catch (Exception e)
                {
                    Console.WriteLine("ERR: {0}; {1}", e.TargetSite, e.Message);
                    throw;
                }
            }

使用するより:

OpenURL(myDriver, myUrl);

これにより、ページが読み込まれ、完了するまで待機して、最大化してフォーカスします。なぜこれがこのようになるのかわかりませんが、うまくいきます。

次または「Navigate()」以外の他のページナビゲーショントリガーをクリックした後、ページの読み込みを待機する場合は、Ben Dyerの回答(このスレッド内)が機能します。


1

タペストリーの Webフレームワークをご覧ください。そこでソースコードダウンロードできます

アイデアは、ページが準備ができていることをbodyのhtml属性で知らせることです。このアイデアを使用して、複雑な訴訟を無視できます。

<html>
<head>
</head>
<body data-page-initialized="false">
    <p>Write you page here</p>

    <script>
    $(document).ready(function () {
        $(document.body).attr('data-page-initialized', 'true');
    });
    </script>  
</body>
</html>

そして、(タペストリーフレームワークに従って)Selenium Webdriverの拡張を作成します。

public static void WaitForPageToLoad(this IWebDriver driver, int timeout = 15000)
{
    //wait a bit for the page to start loading
    Thread.Sleep(100);

    //// In a limited number of cases, a "page" is an container error page or raw HTML content
    // that does not include the body element and data-page-initialized element. In those cases,
    // there will never be page initialization in the Tapestry sense and we return immediately.
    if (!driver.ElementIsDisplayed("/html/body[@data-page-initialized]"))
    {                
        return;
    }

    Stopwatch stopwatch = Stopwatch.StartNew();

    int sleepTime = 20;

    while(true)
    {
        if (driver.ElementIsDisplayed("/html/body[@data-page-initialized='true']"))
        {
            return;
        }

        if (stopwatch.ElapsedMilliseconds > 30000)
        {
            throw new Exception("Page did not finish initializing after 30 seconds.");
        }

        Thread.Sleep(sleepTime);
        sleepTime *= 2; // geometric row of sleep time
    }          
}

Alister Scottによって作成された拡張ElementIsDisplayedを使用します。

public static bool ElementIsDisplayed(this IWebDriver driver, string xpath)
{
    try
    {
        return driver.FindElement(By.XPath(xpath)).Displayed;
    }
    catch(NoSuchElementException)
    {
        return false;
    }
}

そして最後にテストを作成します:

driver.Url = this.GetAbsoluteUrl("/Account/Login");            
driver.WaitForPageToLoad();

1

Ben Dryerの回答が私のマシンでコンパイルされませんでした("The method until(Predicate<WebDriver>) is ambiguous for the type WebDriverWait")。

動作するJava 8バージョン:

Predicate<WebDriver> pageLoaded = wd -> ((JavascriptExecutor) wd).executeScript(
        "return document.readyState").equals("complete");
new FluentWait<WebDriver>(driver).until(pageLoaded);

Java 7バージョン:

Predicate<WebDriver> pageLoaded = new Predicate<WebDriver>() {

        @Override
        public boolean apply(WebDriver input) {
            return ((JavascriptExecutor) input).executeScript("return document.readyState").equals("complete");
        }

};
new FluentWait<WebDriver>(driver).until(pageLoaded);

1

私はこのコードを試してみましたが、うまくいきました。別のページに移動するたびにこの関数を呼び出します

public static void waitForPageToBeReady() 
{
    JavascriptExecutor js = (JavascriptExecutor)driver;

    //This loop will rotate for 100 times to check If page Is ready after every 1 second.
    //You can replace your if you wants to Increase or decrease wait time.
    for (int i=0; i<400; i++)
    { 
        try 
        {
            Thread.sleep(1000);
        }catch (InterruptedException e) {} 
        //To check page ready state.

        if (js.executeScript("return document.readyState").toString().equals("complete"))
        { 
            break; 
        }   
      }
 }

1

Nodejsでは、約束を介してそれを得ることができます...

このコードを記述すれば、その時点でページが完全に読み込まれていることを確認できます...

driver.get('www.sidanmor.com').then(()=> {
    // here the page is fully loaded!!!
    // do your stuff...
}).catch(console.log.bind(console));

このコードを書くと、ナビゲートし、セレンは3秒間待機します...

driver.get('www.sidanmor.com');
driver.sleep(3000);
// you can't be sure that the page is fully loaded!!!
// do your stuff... hope it will be OK...

Seleniumのドキュメントから:

this.get(url)→Thenable

指定されたURLに移動するコマンドをスケジュールします。

ドキュメントの読み込み完了すると解決されるpromiseを返します。

Seleniumのドキュメント(Nodejs)


1

document.readyイベントの待機は、このコードがまだ競合状態にあるため、この問題に対する完全な修正ではありません。ブラウザーが起動していないため、クリックイベントが処理される前にこのコードが呼び出され、直接返される場合があります。まだ新しいページを読み込んでいます。

いくつか検索した後、私はObayにテスト用のヤギの投稿を見つけました。そのソリューションのc#コードは次のようになります。

 IWebElement page = null;
 ...
 public void WaitForPageLoad()
 {
    if (page != null)
    {
       var waitForCurrentPageToStale = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
       waitForCurrentPageToStale.Until(ExpectedConditions.StalenessOf(page));
    }

    var waitForDocumentReady = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
    waitForDocumentReady.Until((wdriver) => (driver as IJavaScriptExecutor).ExecuteScript("return document.readyState").Equals("complete"));

    page = driver.FindElement(By.TagName("html"));

}

`このメソッドをdriver.navigate.gotourlの直後に起動して、できるだけ早くページの参照を取得できるようにします。楽しんでください!


1

通常、セレンがクリックまたは送信または取得メソッドから新しいページを開くと、ページが読み込まれるまで待機しますが、問題は、ページにxhr呼び出し(ajax)がある場合、xhrが読み込まれるのを待たないためです。 xhrを監視してそれらを待つ新しいメソッドを作成することは良いことです。

public boolean waitForJSandJQueryToLoad() {
    WebDriverWait wait = new WebDriverWait(webDriver, 30);
    // wait for jQuery to load
    ExpectedCondition<Boolean> jQueryLoad = new ExpectedCondition<Boolean>() {
      @Override
      public Boolean apply(WebDriver driver) {
        try {
            Long r = (Long)((JavascriptExecutor)driver).executeScript("return $.active");
            return r == 0;
        } catch (Exception e) {
            LOG.info("no jquery present");
            return true;
        }
      }
    };

    // wait for Javascript to load
    ExpectedCondition<Boolean> jsLoad = new ExpectedCondition<Boolean>() {
      @Override
      public Boolean apply(WebDriver driver) {
        return ((JavascriptExecutor)driver).executeScript("return document.readyState")
        .toString().equals("complete");
      }
    };

  return wait.until(jQueryLoad) && wait.until(jsLoad);
}

if $.active == 0そのため、アクティブなxhrs呼び出しはありません(jQueryでのみ機能します)。javascript ajax呼び出しの場合、プロジェクトで変数を作成してシミュレーションする必要があります。


0

これを処理するロジックを記述できます。を返すメソッドを作成しました。WebElementこのメソッドは3回呼び出されるか、時間を増やしてnullチェックを追加できます。WebElementここに例を示します。

public static void main(String[] args) {
        WebDriver driver = new FirefoxDriver();
        driver.get("https://www.crowdanalytix.com/#home");
        WebElement webElement = getWebElement(driver, "homekkkkkkkkkkkk");
        int i = 1;
        while (webElement == null && i < 4) {
            webElement = getWebElement(driver, "homessssssssssss");
            System.out.println("calling");
            i++;
        }
        System.out.println(webElement.getTagName());
        System.out.println("End");
        driver.close();
    }

    public static WebElement getWebElement(WebDriver driver, String id) {
        WebElement myDynamicElement = null;
        try {
            myDynamicElement = (new WebDriverWait(driver, 10))
                    .until(ExpectedConditions.presenceOfElementLocated(By
                            .id(id)));
            return myDynamicElement;
        } catch (TimeoutException ex) {
            return null;
        }
    }

0

ドキュメントの準備ができているかどうかを確認するために、JavaScriptコードを実行しました。クライアント側のレンダリングがあるサイトのセレンテストのデバッグに多くの時間を節約できました。

public static boolean waitUntilDOMIsReady(WebDriver driver) {
def maxSeconds = DEFAULT_WAIT_SECONDS * 10
for (count in 1..maxSeconds) {
    Thread.sleep(100)
    def ready = isDOMReady(driver);
    if (ready) {
        break;
    }
}

}

public static boolean isDOMReady(WebDriver driver){
    return driver.executeScript("return document.readyState");
}

0
public boolean waitForElement(String zoneName, String element, int index, int timeout) {
        WebDriverWait wait = new WebDriverWait(appiumDriver, timeout/1000);
        wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath(element)));
        return true;
    }

0

ルバノフがC#のために書いたように、私はそれをJavaのために書きました、そしてそれは:

    public void waitForPageLoaded() {
    ExpectedCondition<Boolean> expectation = new
            ExpectedCondition<Boolean>() {
                public Boolean apply(WebDriver driver) {
                    return (((JavascriptExecutor) driver).executeScript("return document.readyState").toString().equals("complete")&&((Boolean)((JavascriptExecutor)driver).executeScript("return jQuery.active == 0")));
                }
            };
    try {
        Thread.sleep(100);
        WebDriverWait waitForLoad = new WebDriverWait(driver, 30);
        waitForLoad.until(expectation);
    } catch (Throwable error) {
        Assert.fail("Timeout waiting for Page Load Request to complete.");
    }
}

0

Javaでは以下のようになります:-

  private static boolean isloadComplete(WebDriver driver)
    {
        return ((JavascriptExecutor) driver).executeScript("return document.readyState").equals("loaded")
                || ((JavascriptExecutor) driver).executeScript("return document.readyState").equals("complete");
    }

1
JSコマンドを1つにまとめて、ページを2回たたく必要がないようにするのがよいでしょう。例return document.readyState == 'loaded' || return document.readyState == 'complete'
JeffC

0

次のコードはおそらく機能するはずです。

WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.presenceOfAllElementsLocated(By.xpath("//*")));

0

ページまたはネットワーク接続が遅い場合は、上記のいずれも機能しない可能性があります。私はそれらすべてを試しました、そして私のために働いた唯一のことはそのページの最後の目に見える要素を待つことです。たとえば、BingのWebページを見てみましょう。完全なページが読み込まれた後にのみ表示されるメインの検索ボタンの横にカメラアイコン(画像で検索ボタン)を配置しました。誰もがそうした場合は、上記の例のように明示的な待機を使用するだけで済みます。


-1
public void waitForPageToLoad()
  {
(new WebDriverWait(driver, DEFAULT_WAIT_TIME)).until(new ExpectedCondition<Boolean>() {
      public Boolean apply(WebDriver d) {
        return (((org.openqa.selenium.JavascriptExecutor) driver).executeScript("return document.readyState").equals("complete"));
      }
    });//Here DEFAULT_WAIT_TIME is a integer correspond to wait time in seconds

-1

Rubyで同様のものを次に示します。

wait = Selenium::WebDriver::Wait.new(:timeout => 10)
wait.until { @driver.execute_script('return document.readyState').eql?('complete') }

あなたのコードは私にはうまくいきません。do iframeを切り替えてonload = "javascript:pageload(); functionalPageLoad();"を待つ方法 Rubyでページをリロードするには?ページ内でiframeを開いていることに気づき、アクセスできるようになりました。その後、ページがリロードされ、フレームにアクセスできなくなりました。待機、睡眠、時間、フレームに切り替えてから親に切り替えることに関する多くの回答を読みましたが、目標を達成できません。
Amanda Cavallaro

1
質問は主にiFrameに切り替える方法に関するものであり、ドキュメントのロードを待つことではないようです。iFrameの操作に関する質問で解決策が見つからない場合は、新しい質問を開始することをお勧めします。
エメリー、2016年

-1

ページがリロードされるまでスレッドをスリープさせることができます。ページの読み込みにかかる時間を見積もる必要があるため、これは最適なソリューションではありません。

driver.get(homeUrl); 
Thread.sleep(5000);
driver.findElement(By.xpath("Your_Xpath_here")).sendKeys(userName);
driver.findElement(By.xpath("Your_Xpath_here")).sendKeys(passWord);
driver.findElement(By.xpath("Your_Xpath_here")).click();

Thread.sleep(5000)は、それを使用することに対するすべての推奨事項にもかかわらず、テストを機能させる唯一のメソッドであることがよくあります。特に要素が実際に見つかるまで特定できない要素があるため、要素の待機の組み合わせは機能しません。
Steve Staple

-1

ページの読み込み完了を確認し、Selenium 3.14.0で動作しました

    public static void UntilPageLoadComplete(IWebDriver driver, long timeoutInSeconds)
    {
        Until(driver, (d) =>
        {
            Boolean isPageLoaded = (Boolean)((IJavaScriptExecutor)driver).ExecuteScript("return document.readyState").Equals("complete");
            if (!isPageLoaded) Console.WriteLine("Document is loading");
            return isPageLoaded;
        }, timeoutInSeconds);
    }

    public static void Until(IWebDriver driver, Func<IWebDriver, Boolean> waitCondition, long timeoutInSeconds)
    {
        WebDriverWait webDriverWait = new WebDriverWait(driver, TimeSpan.FromSeconds(timeoutInSeconds));
        webDriverWait.Timeout = TimeSpan.FromSeconds(timeoutInSeconds);
        try
        {
            webDriverWait.Until(waitCondition);
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
        }
    }

-1

特定の要素が表示されるのを待つ必要がある人向け。(c#を使用)

public static void WaitForElement(IWebDriver driver, By element)
{
    WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(20));
    wait.Until(ExpectedConditions.ElementIsVisible(element));
}

次に、たとえば、class = "error-message"がDOMに存在する場合は、単に次のようにします。

WaitForElement(driver, By.ClassName("error-message"));

idの場合は、

WaitForElement(driver, By.Id("yourid"));


-3

Angularを使用していますか?場合は、非同期呼び出しが終了したことをWebドライバーが認識しない可能性があります。

Paul Hammants ngWebDriverを参照することをお勧めします。メソッドwaitForAngularRequestsToFinish()が役に立ちます。


彼はAngularをほとんど使用していませんでした。元の質問を注意深く読んでいないようです。
zelusp 2017

しかし、票を投じて、あなたが形を崩してしまってはいけません。ここにいる人達はまあ意味します。そして、批判は実際には愛の形です(誰かが誰かを正すのに時間をかけると、それが気になるからです)。チェックアウトスマートな方法で質問する方法 -これらのアイデアは、スマートな方法で質問に回答する場合にも適用されます。
zelusp 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.