休眠 | 顯示等待 | 隱式等待 | |
含義 | 腳本在執行到某一位置時作固定時間的休眠。 | 等待某個條件成立時繼續執行,不然在達到最大時長時拋出超時異常。 | 經過必定的時長等待頁面上某元素加載完成。 |
Java | Thread.sleep(時間) | WebDriverWait wait = new WebDriverWait(driver, 時間) | driver.manage().timeouts().implicitlyWait(時間, TimeUnit.SECONDS) |
Python | sleep(時間) | WebDriverWait(driver, 最長超時時間, 間隔時間(默認0.5S), 異常) | driver.implicitly_wait(時間) |
Ruby | sleep(時間) | wait = selenium::webdriver::wait.new(:timeout => 時間) | driver.manage.timeouts.implicit_wait = 時間 |
注意:Java中休眠方法的單位是毫秒,其餘方法的時間單位都爲秒( 1秒=1000毫秒) |
ε(┬┬﹏┬┬)3 雖然只是簡簡單單的等待,可是基於等待的對象不一樣、不一樣對象有不一樣的等待操做,因此有多種或者自定義顯示等待方法(以前文章的代碼主要採用休眠方法,所以在此不作演示)。光光文字沒法闡述完整,咱們先看個表格,而後關門放代碼ฅʕ•̫͡•ʔฅjava
說明 | 顯示等待方法 | ||
Java | Python | Ruby | |
需導入類 | org.openqa.selenium.support.ui.ExpectedConditions | expected_conditions | - |
判斷當前頁面的標題是否等於預期 | titleIs | title_is | - |
判斷當前頁面的標題是否包含預期字符串 | titleContains | title_contains | - |
判斷元素是否加在DOM樹裏(不表明該元素必定可見) | presenceOfElementLocated | presence_of_element_located | - |
判斷元素是否可見(參數爲定位) | visibilityOfElementLocated | visibility_of_element_located | - |
同上個方法(參數爲定位後的元素) | visibilityOf | visibility_of | - |
判斷是否至少有一個元素存在於DOM數中 | presenceOfAllElementsLocatedBy | presence_of_all_elements_located | - |
判斷某個元素中的text是否包含了預期的字符串 | textToBePresentInElement | text_to_be_present_in_element | - |
判斷某個元素的vaule屬性是否包含了預期的字符串 | textToBePresentInElementValue | text_to_be_present_in_element_value | - |
判斷該表單是否能夠切換進去 若是能夠,返回true而且switch進去,不然返回false |
frameToBeAvailableAndSwitchToIt | frame_to_be_available_and_switch_to_it | - |
判斷某個元素是否不存在於DOM樹或不可見 | invisibilityOfElementLocated | invisibility_of_element_located | - |
判斷元素是否可見是能夠點擊的 | elementToBeClickable | element_to_be_clickable | - |
等到一個元素從DOM樹中移除 | stalenessOf | staleness_of | - |
判斷某個元素是否被選中,通常用在下拉列表 | elementToBeSelected | element_to_be_selected | - |
判斷某個元素的選中狀態是否符合預期(參數爲定位後的元素) | elementSelectionStateToBe | element_selection_state_to_be | - |
同上個方法(參數爲定位) | - | element_located_selection_state_to_be | - |
判斷頁面上是否存在alert | alertIsPresent | alert_is_present | - |
(;´༎ຶД༎ຶ`)並非我想偷懶把Ruby的省略了,我找了許多資料都沒有找到Selenium::WebDriver中包含此種類型的方法,後期發現好方法在作添加~~~ |
顯示等待web
1 package JavaTest; 2 3 import java.util.NoSuchElementException; 4 import org.openqa.selenium.By; 5 import org.openqa.selenium.WebDriver; 6 import org.openqa.selenium.WebElement; 7 import org.openqa.selenium.firefox.FirefoxDriver; 8 import org.openqa.selenium.support.ui.ExpectedCondition; 9 import org.openqa.selenium.support.ui.ExpectedConditions; 10 import org.openqa.selenium.support.ui.WebDriverWait; 11 12 public class Test { 13 public static void main(String[] arg) throws InterruptedException 14 { 15 WebDriver driver = new FirefoxDriver(); 16 driver.get("http://www.baidu.com/"); 17 18 /* 19 * 設置顯示等待時長:10秒; 20 */ 21 WebDriverWait wait = new WebDriverWait(driver, 10); 22 23 // 顯示等待:標題是否出現: 24 try { 25 wait.until(ExpectedConditions.titleContains("百度一下,你就知道")); 26 System.out.println("百度首頁的標題已出現"); 27 } catch (NoSuchElementException e) { //若是標題沒有找到,則拋出NoSuchElementException異常。 28 e.printStackTrace(); 29 System.out.println("未找到百度首頁的標題"); 30 } 31 32 //顯示等待:搜索框是否出現 33 try { 34 wait.until(ExpectedConditions.presenceOfElementLocated(By.id("su"))); 35 System.out.println("百度首頁的搜索輸入框已出現"); 36 } catch (NoSuchElementException e) { //若是標題沒有找到,則拋出NoSuchElementException異常。 37 e.printStackTrace(); 38 System.out.println("未找到百度首頁的輸入框"); 39 } 40 41 //顯示等待:頁面搜索按鈕是否能夠被點擊; 42 try { 43 wait.until(ExpectedConditions.elementToBeClickable(By.id("kw"))); 44 System.out.println("百度首頁的搜索按鈕能夠被點擊"); 45 } catch (NoSuchElementException e) { //若是標題沒有找到,則拋出NoSuchElementException異常。 46 e.printStackTrace(); 47 System.out.println("未找到百度首頁的搜索按鈕"); 48 } 49 50 /* 51 * 自定義顯示等待,獲取頁面元素//*[@id='cp']的文本值 52 */ 53 String text = (new WebDriverWait(driver, 10)).until(new ExpectedCondition<String>() { 54 @Override 55 public String apply(WebDriver driver){ 56 return driver.findElement(By.xpath("//*[@id='cp']")).getText(); 57 } 58 }); 59 System.out.println(text); //打印文本值 60 61 /* 62 * 自定義顯示等待,在等待代碼中找到某個元素; 63 */ 64 WebElement textInputBox = (new WebDriverWait(driver, 10)).until(new ExpectedCondition<WebElement>() { 65 @Override 66 public WebElement apply(WebDriver driver){ 67 return driver.findElement(By.xpath("//*[@id='kw']")); 68 } 69 }); 70 textInputBox.sendKeys("自定義顯式等待,在等待代碼中找到某個元素"); 71 72 driver.close(); 73 } 74 }
隱式等待瀏覽器
1 package JavaTest; 2 3 import java.util.NoSuchElementException; 4 import java.util.concurrent.TimeUnit; 5 import org.openqa.selenium.By; 6 import org.openqa.selenium.Keys; 7 import org.openqa.selenium.WebDriver; 8 import org.openqa.selenium.firefox.FirefoxDriver; 9 import org.openqa.selenium.interactions.Actions; 10 11 public class Test { 12 public static void main(String[] arg) throws InterruptedException 13 { 14 WebDriver driver = new FirefoxDriver(); 15 16 /* 17 *設置全局隱式等待時間 18 *使用implicitlyWait方法,設定查找元素的等待時間 19 *當調用findElement方法的時候,沒有馬上找到元素,就會按照設定的隱式等待時長等待下去 20 *若是超過了設定的等待時間,尚未找到元素,就拋出NoSuchElementException異常 21 */ 22 driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); 23 driver.get("http://www.baidu.com/"); 24 25 try 26 { 27 driver.findElement(By.xpath("//*[@class='s_ipt']")).sendKeys("Java"); // 對百度輸入框賦值 28 driver.findElement(By.id("kw1")).sendKeys(Keys.chord(Keys.CONTROL,"A")); // 頁面沒有id爲kw1的元素,此處報錯 29 }catch(NoSuchElementException e) { 30 //若是元素沒有找到,則拋出NoSuchElementException異常。 31 e.printStackTrace(); 32 } 33 finally 34 { 35 driver.close(); 36 } 37 } 38 }
顯示等待ruby
1 from selenium import webdriver 2 from selenium.webdriver.common.by import By 3 from selenium.webdriver.support import expected_conditions as EC 4 5 # 啓動Firefox瀏覽器 6 from selenium.webdriver.support.wait import WebDriverWait 7 8 driver = webdriver.Firefox() 9 driver.get('http://www.baidu.com') 10 11 # 設置顯示等待時間爲10S 12 wait = WebDriverWait(driver, 10) 13 14 # 顯示等待:頁面標題是否包含「百度一下」 15 try: 16 wait.until(EC.title_contains('百度一下')) 17 print("百度首頁的標題已出現") 18 except Exception as e: 19 print(e.args[0]) # 顯示報錯緣由 20 print('未找到百度首頁的標題') 21 22 # 顯示等待:元素是否可見 23 try: 24 element = wait.until(EC.visibility_of(driver.find_element(By.ID,'kw'))) 25 element.send_keys('Python') 26 print('百度首頁的搜索輸入框可見') 27 except Exception as e: 28 print(e.args[0]) 29 print('百度首頁的搜索輸入框不可見') 30 31 # 顯示等待:元素是否能夠點擊 32 try: 33 element = wait.until(EC.element_to_be_clickable((By.XPATH,"//*[@id='su']"))) 34 element.click() 35 print('百度首頁的搜索按鈕能夠被點擊') 36 except Exception as e: 37 print(e.args[0]) 38 print('未找到百度首頁的搜索按鈕')
隱式等待app
1 from time import * 2 from selenium import webdriver 3 from selenium.webdriver.common.by import By 4 from selenium.webdriver.common.keys import Keys 5 from selenium.common.exceptions import NoSuchElementException 6 7 # 啓動Firefox瀏覽器 8 driver = webdriver.Firefox() 9 10 driver.implicitly_wait(10) # 設置隱式等待時間10S 11 driver.get('http://www.baidu.com') 12 13 try: 14 print(ctime()) # 當前時間 15 driver.find_element(By.XPATH,"//*[@class='s_ipt']").send_keys('Python') # 對百度輸入框賦值 16 driver.find_element(By.ID,'kw2').send_keys(Keys.CONTROL, 'A') # 頁面沒有id爲kw2的元素,此處報錯 17 except NoSuchElementException as e: 18 print(e) # 顯示報錯信息 19 finally: 20 print(ctime()) # 此處檢查等待後的時間 21 driver.close() # 結束
顯示等待ide
1 class Baidu 2 require 'rubygems' 3 require 'selenium-webdriver' 4 5 # 打開firefox並輸入網址 6 driver = Selenium::WebDriver.for :firefox 7 driver.navigate.to "http://www.baidu.com" 8 9 # 設置顯式等待時間10S 10 wait = Selenium::WebDriver::Wait.new(:timeout => 10) 11 12 # 顯示等待:元素是否顯示(return [Boolean]) 13 begin 14 wait.until {driver.find_element(:id => 'kw').displayed?} 15 puts "百度首頁的搜索輸入框可見" 16 rescue => e 17 puts e.message # 顯示報錯信息 18 end 19 20 # 顯示等待:指定元素是否爲空 21 begin 22 wait.until {driver.find_element(:id => 'kw').attribute('value').empty?} 23 puts "百度首頁的搜索輸入框爲空" 24 rescue => e 25 puts e.message # 顯示報錯信息 26 end 27 # 顯示等待:頁面標題是不是指定標題 28 begin 29 wait.until {driver.title.eql?'百度一下,你就知道'} 30 puts "頁面標題是百度一下,你就知道" 31 rescue => e 32 puts e.message # 顯示報錯信息 33 end 34 35 36 # 顯示等待:頁面標題是否包含「百度一下」 37 begin 38 wait.until {driver.title.include?'百度一下'} 39 puts "百度首頁的標題已出現" 40 rescue => e 41 puts e.message # 顯示報錯信息 42 ensure 43 driver.quit 44 end 45 end
隱式等待ui
1 class Baidu 2 require 'rubygems' 3 require 'selenium-webdriver' 4 5 # 打開firefox並輸入網址 6 driver = Selenium::WebDriver.for :firefox 7 8 # 設置隱式等待時間10S 9 driver.manage.timeouts.implicit_wait = 10 10 driver.navigate.to "http://www.baidu.com" 11 12 begin 13 driver.find_element(:name => 'wd').send_keys('ruby') # 對百度輸入框賦值 14 driver.find_element(:id => 'kw3').send_keys [:control,'a'] # 頁面沒有id爲kw3的元素,此處報錯 15 rescue Selenium::WebDriver::Error::NoSuchElementError => e 16 puts e.message # 顯示報錯信息 17 ensure 18 driver.close #退出程序 19 end 20 end