休眠 | 显示等待 | 隐式等待 | |
含义 | 脚本在执行到某一位置时做固定时间的休眠。 | 等待某个条件成立时继续执行,否则在达到最大时长时抛出超时异常。 | 通过一定的时长等待页面上某元素加载完成。 |
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 | 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
显示等待
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
显示等待
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('未找到百度首页的搜索按钮')
隐式等待
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
显示等待
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
隐式等待
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