簡體   English   中英

Selenium c# 等待 javascript 執行

[英]Selenium c# Wait for javascript to execute

我正在使用 Selenium 和 c# 中的 Nunit 進行一些單元測試。

理論上這很簡單,我有一個元素我想點擊 go 到另一個頁面。 我遇到的問題是使其可點擊的部分加載時間晚於實際元素。 這意味着如果我只是等到元素加載完畢,單擊它仍然沒有任何作用。 我也嘗試等待它可以點擊,但它似乎仍然不起作用。

除了 static 延遲之外,還有什么辦法可以解決這個問題?

謝謝

我建議你創建一個等待 ajax/jquery 的方法:

public void WaitForJqueryAjax() {
    int delay = MaxdelaySeconds;
    while(delay > 0) {
        Thread.Sleep(1000);
        var jquery = (bool)(this.driver as IJavaScriptExecutor)
            .ExecuteScript("return window.jQuery == undefined");
        if(jquery) {
            break;
        }
        var ajaxIsComplete = (bool)(this.driver as IJavaScriptExecutor)
            .ExecuteScript("return window.jQuery.active == 0");
        if(ajaxIsComplete) {
            break;
        }
        delay--;
    }
}

在我的實現中, int delay = MaxdelaySeconds; 與我的驅動程序隱式等待時間具有相同的值。

(如果需要,修改上述方法以將您的驅動程序作為參數)

也許您需要執行 JavaScript 或 Jquery 代碼

例如:

            driver.ExecuteJavaScript("$(\"#CategorylId\").CascadingDropDown(\"#WareId\", \'/store/log/AsyncWare\');");
            WaitUntilLoad(driver, "WareId", 5000);
            page = driver.PageSource;

有關其他信息,此鏈接可能有用

所以有幾種方法:

  1. 等待 ajax 被執行。 如果元素由 ajax 加載,您可以使用以下代碼:
    public void WaitForAjax(){
         var miliSecondsToWait = 15000;
         bool ajaxIsComplete = false;
         while (!ajaxIsComplete && miliSecondsToWait > 0) // Handle timeout somewhere
        {
             ajaxIsComplete = (bool)(Driver as IJavaScriptExecutor).ExecuteScript("return jQuery.active == 0");
             Thread.Sleep(200);
             miliSecondsToWait -= 200;
        }
     }
  1. 最簡單的解決方案,但不是推薦的方法:只需將您的線程置於睡眠狀態:
     Thread.Sleep(10000). 

等待 10 秒(不推薦的方法)不要忘記導入 System.Threading;

  1. 編寫一個自定義的 function 用於等待元素可以被點擊例如:
     protected Func<IWebDriver, bool> ButtonToBeSuccessfullyClicked(IWebDriver driver, By locator)
           {
               Func<IWebDriver, bool> func = (_driver) =>
               {
                   if (E(locator).Displayed)
                   {
                       E(_continueButton).Click();
                       return false;
                   }
                   else
                   {
                       return true;
                   }

               };
              return func;
     }

使用該方法,您可以在預期條件下調用此 function

     Driver.Until(ButtonToBeSuccessfullyClicked(Driver, _continueButton)); 

請注意,如果您使用的是 SeleniumExtras.WaitHelpers.ExpectedConditions,function 將無法工作,您必須編寫自己的實現。

這是我的首選方式。 如果在單擊過程中引發異常,您可以將單擊包裝在 try-catch 中。 所以結果將如下所示:

     protected Func<IWebDriver, bool> ButtonToBeSuccessfullyClicked(IWebDriver driver, By locator)
           {
               Func<IWebDriver, bool> func = (_driver) =>
               {
                   if (E(locator).Displayed)
                   {
                       try {
                            E(_continueButton).Click();
                            return false;
                       } catch ()
                       {
                           return true;
                       }

                   }
                   else
                   {
                       return true;
                   }

               };
              return func;
     }

請仔細檢查 function 應該返回的內容,因為我沒有運行代碼,所以我沒有運行代碼,所以我是根據我的 memory 寫的(可能記錯了)

  1. 如問題中所述,用戶有點粗魯地提醒我=)。 單擊元素時沒有任何異常。 另一種解決方案是比較 HTML 的完全工作元素在工作時(可點擊)和相同元素但在開始時不工作時(不可點擊)。 如果元素在 HTLM、css class 名稱、css 樣式等方面有任何差異,您可以在測試代碼中等待此更改。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM