2015-10-20 50 views
1

如果我的問題聽起來很主要,我很抱歉,我在QA和Selenium方面很新。等待網頁元素的好方法

我使用Java和硒編寫測試,有時我需要等待網絡元素是可訪問的,下面是我的代碼片段,我曾經使用:

 int counter = 0; 
     while (true) { 
      counter++; 
      boolean breakIt = false; 
      try { 
       WebElement element= driverChrome.findElement(By.xpath("bla bla")); 
       element.click(); 
       breakIt = true; 
      } catch (Exception e) {    
       Thread.sleep(1000); 
      } 
      if (breakIt) { 
       break; 
      } 
      if (counter > 4) { 
       System.out.println("Failed"); 
       tearDown(); 
       System.exit(1); 
      } 
     } 

但現在某處我看到這一點:

WebDriverWait wait = new WebDriverWait(driverChrome, 10); 
wait.until(ExpectedConditions.elementToBeClickable(By.xpath("bla bla"))).click(); 

肯定的,第二個是要短得多,但我不知道這是否是好是壞,換句話說,它們有什麼不同?如果是,如何?哪一個更適合哪種用途?

+0

使用WebDriverWait始終是睡眠語句的理想選擇。一旦元素被加載,它就會立即變得難以處理,而不是等待一定的時間。特別是如果你有很多利用相同步驟的測試,從長遠來看可以節省大量時間。 – AutomatedOrder

+0

@AutomatedOrder感謝您的回覆,請將其作爲回答發佈?如果你知道,你能告訴我在哪裏可以學到更多關於ExpectedConditions的知識。方法? – LoveLovelyJava

+0

可能重複的[Selenium等到元素存在](http://stackoverflow.com/questions/20903231/selenium-wait-until-element-is-present) – JeffC

回答

1

使用WebDriverWait始終是睡眠語句的理想選擇。一旦元素被加載,它就會立即變得難以處理,而不是等待一定的時間。特別是如果你有很多利用相同步驟的測試,從長遠來看可以節省大量時間。

至於ExpectedConditions,我會推薦this page,

+0

在哪裏可以下載javadoc ** jar ** for org .openqa.selenium.support。我可以將它添加到我的項目中,當我將鼠標懸停在某個方法上時,它會顯示一些有關它的信息? – LoveLovelyJava

+0

我在c#中使用硒,所以我不是100%正面的,但這個鏈接應該是你正在尋找的,你只需要得到你的版本:http://www.java2s.com/Code/Jar /s/selenium-support.htm – AutomatedOrder

5

答案you accepted不正確。

WebDriverWait做什麼是粗略地講同樣的事情,你的代碼片段做什麼:它輪詢DOM定期檢查你想讓它檢查的條件是否爲真。如果它不是真的,那麼它使用Thread.sleep爲你。 (你能確定我在說什麼在這裏通過讀取implementation of FluentWait,這是其WebDriverWait是基於類和Sleeper因爲FluentWait使用Sleeper.SYSTEM_SLEEPER去投票之間睡覺。)

相反到什麼公認的答案斷言(「一旦元素被加載,它就會立即變得棘手)」,當你等待的條件變爲真時,WebDriverWait不會立即讓你與元素交互。如果WebDriverWait實例在條件成立時正在休眠,則它將繼續休眠,直到其休眠間隔結束(默認爲0.5秒),然後它將再次檢查條件並在條件爲真時立即返回。否則,它會回到睡眠,除非你給它的超時已經過期。

您的自制等待外觀與WebDriverWait之間的區別在於,WebDriverWait可重複使用,靈活且專爲處理您的代碼無法處理的一堆條件而設計。或者換句話說,它更強大。特別是,它會讓例外,它不知道如何處理涓滴,而不是像你的代碼一樣隱藏它們。 我無法想象你的代碼會更好。

+0

非常感謝您的幫助,我可以在哪裏下載org.openqa.selenium.support.ui的javadoc jar,以便將它添加到我的項目中,並且當我將鼠標懸停在某個方法上時,它會顯示一些內容有關它的信息? – LoveLovelyJava

+0

@LoveLovelyJava恐怕,我無法將javadoc鏈接到您的項目。我可以閱讀Java,但是由於我不得不以任何實際的能力編寫代碼,這已經過去了十年。 – Louis