2017-08-16 19 views
1

我有一個關於在硒中等待的問題,並想知道什麼是執行一般等待的最佳方法。如何在硒中執行一般等待

實際上,我輸入一個測試條,然後出現一個下拉菜單。在HTML設計是糟糕,所以我需要做的是:

1:寫我的文字在測試輸入,低於

WebDriverWait waitAgency = new WebDriverWait(_driver, TimeSpan.FromSeconds(3)); 
    waitAgency.Until(ExpectedConditions.ElementToBeClickable(By.Id(_webElement["agency"]))) 
     .SendKeys("test agent"); 

2:然後我將只需要間隔2秒becasue下拉可能需要加載該值。這是我需要幫助的。

3:我選擇「TAB」鍵,以便它選擇的值:

_driver.FindElement(By.Id(_webElement["agency"])).SendKeys("TAB"); 

我的問題是關於點2,什麼是選擇前,只需等待2秒的最好方式「 TAB'按鈕?我沒有什麼要等到,我只想等待2秒鐘。

感謝,

+0

我會讀這個線程 - https://stackoverflow.com/questions/6992993/selenium-c-sharp-webdriver-wait-until-element-is-present – Dazed

回答

0

,如果你只是想等待2秒,(我不認爲是一個很好的做法),你可以只是簡單的暫停線程。

Thread.Sleep(2000); //time is in milliseconds 

爲了更好的事情是等待下拉元素可見。

0

您可以使用這樣的事情:

public static void Wait(int miliseconds, int maxTimeOutSeconds = 60) 
{ 
    var wait = new WebDriverWait(Driver, new TimeSpan(0, 0, 1, maxTimeOutSeconds)); 
    var delay = new TimeSpan(0, 0, 0, 0, miliseconds); 
    var timestamp = DateTime.Now; 
    wait.Until(webDriver => (DateTime.Now - timestamp) > delay); 
} 

細節here

+0

雖然代碼是不同的,這是真的與Thread.Sleep()沒有什麼不同,這是一種不好的做法。重點在等待硬編碼的時間到期是不好的做法。最佳做法是等待具體元素等可操作,以便腳本儘快繼續。 – JeffC

+0

@JeffC同意壞習慣,特別是暫停線程,除非它真的是必需的。很高興看到C#中一些良好實踐的例子。我很喜歡Java,所以可以提供很好的實例,但這不是本主題的要點。 – Mykola

+0

OP在此問題中使用C#中的顯式等待是一個示例,這是最佳實踐。如果你做了一些搜索,網絡上還有很多其他人。 – JeffC

0

我有3點分辨率爲您的步驟,每一個你的步驟3如下:

  1. 在測試輸入中寫入文本時,如果頁面先前已加載,則不需要誘發任何ExplicitWaitExplicitWait在那裏毫無意義。所以你可以刪除ExplicitWait
  2. 由於您需要等待2秒鐘才能使用值(通過JavaScript/AjaxCalls)加載下拉列表,因此您需要在該列表中輸入ExplicitWait。因此,當您開始尋找xpathcss的下拉元素時,誘發ExplicitWait
  3. 接下來你要通過'TAB'按鈕選擇一個選項,其值爲not_so_perfect的方法。如果控件是一個簡單的下拉列表(Select類),則可以使用options或者selectByIndex(),selectByValue()selectByVisibleText()。否則,如果下拉(自動建議)是在單獨的divulli,試圖通過id選擇,name或構建一個獨特xpathcss點擊/選擇一個值。
0

等待硬編碼的2秒是一個不好的做法。網絡上有大量的信息描述了爲什麼,但Thread.Sleep()或任何等待,而不是一個事件,但在一個固定的時間都屬於這個類別。

對於第2步,爲什麼不等到您要查找的元素是可點擊的?如果它是一個自動建議列表或類似的東西,列表的HTML將被構建,所以你可以等待你想要點擊的元素,然後點擊它(而不是使用TAB)。

0

您可以設置ImpicitWait。默認情況下,ImplicitWait設置爲0毫秒。將其更改爲您希望等待的時間。

_driver.GetDriver().Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10);