【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
相关文章
相关标签/搜索