【Web自動化測試——代碼篇六】經常使用方法——咱們在等待

  休眠 顯示等待 隱式等待
含義 腳本在執行到某一位置時作固定時間的休眠。 等待某個條件成立時繼續執行,不然在達到最大時長時拋出超時異常。 經過必定的時長等待頁面上某元素加載完成。
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中包含此種類型的方法,後期發現好方法在作添加~~~

Java

顯示等待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 }

Python

顯示等待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() # 結束

Ruby

顯示等待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
相關文章
相關標籤/搜索