Selenium爬蟲遇到超時TimeOut問題的解決方法

曾優發表於2018-12-06

1.顯式等待

顯式等待,就是明確的要等到某個元素的出現或者是某個元素的可點選等條件,等不到,就一直等,除非在規定的時間之內都沒找到,那麼就跳出Exception.

/*** 設定元素等待時間* * @param driver* @param by* @param timeOut  //等待時間,以秒為單位*            */
public static void waitForLoad(WebDriver driver, final By locator, int timeOut) {
WebDriverWait wait = new WebDriverWait(driver, timeOut);  // timeOut為等待時間,單位秒
wait.until(new ExpectedCondition<Boolean>() {
public Boolean apply(WebDriver d) {
boolean loadcomplete = d.findElement(locator).isDisplayed();
return loadcomplete;}});}

2.隱式等待

driver.manage().timeouts().implicitlyWait(second, TimeUnit.SECONDS); //second為等待時間,單位秒

設定driver內findElement等方法的超時時間,該設定為全域性設定,使用起來比較方便。
隱式等待, 此處的隱式等待是針對Driver 每次執行命令的 最長執行時間也可以理解為超時時間,  一些人對此處有誤解,認為是讓Driver等一段時間,  確實某些時候能讓Driver等一段時間, 但是影響是全域性的,每次Driver執行 找不到元素都會等待此處設定的時間,  假設某處將此值設定的太長,必須在執行完成之後還原回來,否則判斷一個元素是否存在的時候,就會遇到很坑爹的問題。   改進後的方法如下:

WebDriver會進行一個隱式等待,但引數只有時間,這就導致我需要什麼元素出現,我不一定能等到它,
  private boolean isElementPresent(By by) { 
    try { 
      driver.manage().timeouts().implicitlyWait(1, TimeUnit.SECONDS); 
      driver.findElement(by); 
      return true; 
    } catch (NoSuchElementException e) { 
      return false; 
    } 
  }

得不到某個元素,我們就延遲一下...

3.執行緒休眠
Thread.sleep(3000); //執行緒停止3秒
 

相關文章