3

問題が発生しました。私のウェブページにはDropDownListコントロールがあります。DropDownList(別の値を選択して)値が変更されると、ページが更新され、コンテンツがレンダリングされます。

そして、私はThread.Sleep(2000);それが行く前に使用する必要がありFindElementます。

私の質問:ページが読み込まれるまで待つ最良の方法は何ですか?

私のコードには非常に多くのインスタンスがあるので、Thread.Sleep(2000)これは問題に取り組むための最良の方法ではないと思い始めています。

これが私のコードです:

[TestInitialize()]
public void Setup()
{
    if (BaseIntegrationTest.browserType.Equals(BaseIntegrationTest.IE))
    {
        driver = new InternetExplorerDriver();
    }
    else if (BaseIntegrationTest.browserType.Equals(BaseIntegrationTest.CHROME))
    {
        //driver = new ChromeDriver();
    }
    else if (BaseIntegrationTest.browserType.Equals(BaseIntegrationTest.FIREFOX))
    {
        driver = new FirefoxDriver();
    }
}

そして2番目の部分:

[TestMethod]
public void testVerifyData()
{
    // ...................
    // ...................
    driver.FindElement(By.XPath("//*[@id='ctl00_NavigationControl1_lnke']")).Click();

    Thread.Sleep(2000);

    //select from the dropdownlist.
    IWebElement catagory = driver.FindElement(By.Id("ctl00_ContentPlaceHolder1_Filter"));
    SelectElement selectCatagory = new SelectElement(catagory);
    selectCatagory.SelectByText("Employee");

    Thread.Sleep(2000);
    // ...................
    // ...................
}
4

6 に答える 6

7

Thread.Sleep()は、待機を実装するための非常に推奨されない方法です。

このコードは、セレンのドキュメントhttp://seleniumhq.org/docs/04_webdriver_advanced.htmlに概説されています。

WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
IWebElement category = wait.Until<IWebElement>((d) =>
    {
        return d.FindElement(By.Id("ctl00_ContentPlaceHolder1_Filter"));
    });

これは、要素が見つかるまでセレンがアクションを実行しない明示的な待機の例です。

暗黙的な待機の例は次のとおりです。

driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(10));
IWebElement category = driver.FindElement(By.Id("ctl00_ContentPlaceHolder1_Filter"));

暗黙的な待機では、ドライバーは指定された時間待機し、存在しない要素がないかDOMをポーリングします。

編集

public WaitForElement(string el_id)
{
    WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
    IWebElement category = wait.Until<IWebElement>((d) =>
    {
        return d.FindElement(By.Id(el_id));
    });
}
于 2012-08-15T22:07:01.737 に答える
1

私もWebDriverWaitを使用してこの問題を解決します。

ただし、最後の要素が表示されるまで待機するように設定しました(例:フッター、リストの最後の項目)。

WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
wait.Until(d => d.FindElement(By.Id("footer")).Displayed);

また

WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
wait.Until(d => d.FindElements(By.TagName("li")).Last().Displayed);
于 2014-12-19T07:16:52.067 に答える
1

待機する必要がある場合があります。その場合、Task.Delayメソッドは、Thread.Sleepよりも予測可能な結果を​​提供します。

Task.Delay(1000).Wait(); //1秒待ちます

于 2016-03-23T17:43:55.653 に答える
0

相互作用によって引き起こされる更新がSeleniumが検出できるものであると仮定すると、次の方法で必要な処理が実行される可能性があります。

waitForPageToLoad

私の知る限り、このメソッドはブラウザー内の状態をチェックして、ブラウザーが何かをロードしていると見なすかどうかを確認し、この状態がクリアされるまで待機します。ただし、この準備完了状態は古いものです。ページまたはページの一部を動的にロードする方法は非常に多いため、準備完了状態は常に何が起こっているかを正確に表したものではありません。

アクションの結果として何が変更されるかがわかっている場合、つまり、ドロップダウンリストを操作した後、以前はページになかった特定のUI要素が表示されることがわかっている場合は、おそらくより良いでしょう。それらの特定のUI要素が表示されるのを待ってください。これを行うには、 isTextPresentを繰り返しチェックし、タイムアウトに達するか、予期される要素が表示されるまで少しずつ待機するメソッドを記述します。これらのメソッドで使用できる他の「isXPresent」メソッドがあります。これらは、リンクしたSeleniumインターフェイスの他の場所にあります。

于 2012-08-14T19:44:59.160 に答える
0

ページがロードされた後、またはタイムアウトが期限切れになった後にhtmlを取得したい場合:

using (var chromeDriver = new ChromeDriver())
        {
            chromeDriver.Manage().Timeouts().SetPageLoadTimeout(TimeSpan.FromSeconds(30));

            try
            {
                chromeDriver.Navigate().GoToUrl(link);
                return chromeDriver.PageSource;
            }
            catch (WebDriverTimeoutException)
            {
                return chromeDriver.PageSource;
            }
        }
于 2014-06-20T06:04:32.530 に答える
0

私は自分のためにカスタム関数を作成しました、多分それは誰かのために役立つでしょう:

 public static void waitForPageToBeLoaded(WebDriver driver, int time) {

     ExpectedCondition<Boolean> expectation = new
     ExpectedCondition<Boolean>() {     
         public Boolean apply(WebDriver driver) {
             return ((JavascriptExecutor) driver).executeScript("return document.readyState").equals("complete");
            }
     };

     Wait<WebDriver> wait = new WebDriverWait(driver, Long.valueOf(time)); 
     try {
         wait.until(expectation);
     } catch(Throwable error) {
         System.out.println(error);
         mainFunctions.reportFailure("[waitForPageToBeLoaded] Page load took longer than " + time/60 + " min.");
     }
 }  // waitForPageLoaded
于 2015-02-04T12:07:29.607 に答える