【Python自动化测试】:3种元素等待方式

为何需要等待元素呢?

1、 某些元素或者操作,只有在加载完成后才能够正确定位到。
2、 若是元素还没有加载出来,就执行查询该元素的代码,就会出现错误:no such element

1、元素等待方式一:sleep()强制等待

【语法实现】

  • time.sleep(5)单位是s,线程直接进入休眠,这几秒内啥事也不用干
from time import sleep
sleep(5)

【优点】

  • 简单明了

【缺点】

  • 休眠时间不好把握:
    • 如果设置休眠时间过短,休眠结束元素还没有加载出来,会导致程序报错;
    • 如果设置休眠时间过长,元素已经加载出来程序还在继续等待,会造成时间浪费,影响代码的整体运行效率。

2、元素等待方式二:隐式等待implicitly_wait()

  • driver.implicitly_wait(5)
  • 默认是0s等待,设置之后的值是最大超时时间,等待时间为整个页面全部加载完成的时间

优点

  • 作用于全局:在初始化driver后面加,后面的代码都会受到影响
  • 设置的时间为整个页面的最大加载时长,非必须等待时长(如果在设置的最大超时时间之前整个页面已经加载完成,就会立即执行下面的脚本)

缺点

  • 在设置的最大超时时间结束后仍然没有加载到整个页面,就会报错:no such element

3、元素等待方式三:显式等待WebDriverWait()

  • 等待指定元素,等到就可以返回元素对象;在超时时间到达之后仍未等到,那么就抛出异常:TimeoutException。
  • 简而言之,就是直到元素出现就去操作,如果超时就抛出异常。
  • WebDriverWait()的结果返回定位到的元素
#导包
from selenium import webdriver
from selenium.webdriver.common.by import By
# 导入显式等待的包
from selenium.webdriver.support.ui import WebDriverWait

# 语法   
element = WebDriverWait(自定义浏览器驱动名称, 最大超时时间, 检测的时间间隔).until(定位元素的方法, 错误信息)
  • 示例
# 导包
from selenium import webdriver
from selenium.webdriver.common.by import By
# 导入显式等待的包
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

from time import sleep

# 生成谷歌浏览器对象
driver = webdriver.Chrome()

# 打开百度网页
driver.get('https://www.baidu.com/')

# 在百度搜索输入框输入“python自动化”,并点击“百度一下”按钮
driver.find_element(By.ID, 'kw').send_keys("python自动化")
driver.find_element(By.CSS_SELECTOR, '#su').click()

# 显式等待元素
element = WebDriverWait(driver, 5, 0.5).until(EC.presence_of_element_located((By.PARTIAL_LINK_TEXT, "办公")), '没有找到元素')
element.click()

# 返回的页面停留5秒钟
sleep(5)
# 关闭浏览器
driver.quit()

3.1 导入excepted_conditions 模块

from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
  • 判断一个元素是否存在。如:如何判断alert弹窗出来了;如何判断冬天的元素等

3.1.1 title_is()

  • 判断当前页面的title是否完全等于(==)预期字符串,返回结果为布尔类型
# 导包
from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC

# 生成浏览器驱动对象
driver = webdriver.Chrome()
# 打开百度首页
driver.get('https://www.baidu.com')

# 判断返回的页面标题是否和预期一致,判断结果为布尔类型
result = EC.title_is('百度一下,你就知道')(driver)
# 打印返回结果
print(result)

3.1.2 title_contains()

  • 判断当前页面的标题是否包含预期字符串,返回结果为布尔类型
# 导包
from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC

# 生成浏览器驱动对象
driver = webdriver.Chrome()
# 打开百度首页
driver.get('https://www.baidu.com')

# 判断返回的页面标题是否包含预期字符串,判断结果为布尔类型
result2 = EC.title_contains('知道')(driver)

# 打印返回结果
print(result2)

3.1.3 presence_of_element_located()方法

def presence_of_element_located(locator: Any) -> (driver: {find_element}) -> Any
An expectation for checking that an element is present on the DOM of a page. This does not necessarily mean that the element is visible.
locator - used to find the element returns the WebElement once it is located
# 导包
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
# 语法 
element = WebDriverWait(自定义浏览器驱动名称, 最大超时时间, 检测的时间间隔).until(EC.presence_of_element_located((By.属性名, '属性值'), 错误信息)
  • 一种 WebDriverWait 方法,用于等待某个元素出现在页面上。它可以通过在页面上查找元素来判断页面是否加载完成。
# 导包
# 导包
from selenium import webdriver
from selenium.webdriver.common.by import By
# 导入显式等待的包
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

from time import sleep

# 生成谷歌浏览器对象
driver = webdriver.Chrome()

# 打开百度网页
driver.get('https://www.baidu.com/')

# 在百度搜索输入框输入“python自动化”,并点击“百度一下”按钮
driver.find_element(By.ID, 'kw').send_keys("python自动化")
driver.find_element(By.CSS_SELECTOR, '#su').click()

# 显式等待元素
element = WebDriverWait(driver, 5, 0.5).until(EC.presence_of_element_located((By.PARTIAL_LINK_TEXT, "办公")), '没有找到元素')
element.click()

# 返回的页面停留5秒钟
sleep(5)
# 关闭浏览器
driver.quit()

你可能感兴趣的:(自动化测试,python,自动化)