一、元素等待
大多数的 web 应用程序都是使用 ajax 和 javascript 开发的,加载时都有加载顺序,可能打开了网页但是元素并未加载出来,这个时候就定位不到元素了,就会报错。所以,我们需要等到元素被加载出来后再去进行定位等操作。
1.1 强制等待
如果元素已经出现还是要继续等待,直到超时,会浪费很多的时间,不建议使用。
import time time.sleep(5) # 固定休眠5秒
1.2 隐式等待
创建driver时,为浏览器对象创建一个等待时间,整个 driver 的会话周期内设置一次即可。需要等待整个页面加载完成才会行下一步,可能页面加载未完成的时候,需要定位的元素已经加载完成了,但因为某些JS文件、图片未加载完成,不能执行下一步,增加了不必要的等待时间。
from selenium import webdriver driver = webdriver.Chrome() driver.get("http://localhost:63342/webtest/demo.html") driver.implicitly_wait(10) driver.quit()
1.3 显示等待
显示等待只对某个元素生效,无需等待页面加载完成,节省了加载时间。
等到某个条件满足后,再执行操作(程序每隔 x 秒查询一次,若条件成立则执行下一步,否则继续等待,超过设置的最长时间条件仍不成立则抛出 TimeoutException)
WebDriverWait 显示等待类:WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None):
driver:浏览器驱动
timeout:最长超时时间,默认以秒为单位
poll_frequency:检测的间隔(步长)时间,默认为0.5S
ignored_exceptions:超时后的异常信息,默认情况下抛NoSuchElementException异常
WebDriverWait 一般和 until()、until_not() 方法配合使用:
until:直到条件成立
until_not:直到条件不成立
expected_condition 模块提供了希望发生的条件,如 presence_of_element_located 元素存在、visibility_of_element_located 元素可见、element_to_be_clickable 元素可点击,常用操作如下:
expected_condition
方法 | 说明 |
title_is | 判断当前页面的 title 是否完全等于(==)预期字符串,返回布尔值 |
title_contains | 判断当前页面的 title 是否包含预期字符串,返回布尔值 |
presence_of_element_located | 判断某个元素是否被加到了 dom 树里,并不代表该元素一定可见 |
visibility_of_element_located | 判断某个元素是否可见. 可见代表元素非隐藏,并且元素的宽和高都不等于 0 |
visibility_of | 跟上面的方法做一样的事情,只是上面的方法要传入 locator,这个方法直接传定位到的 element 就好了 |
presence_of_all_elements_located | 判断是否至少有 1 个元素存在于 dom 树中 |
text_to_be_present_in_element | 判断某个元素中的 text 是否 包含 了预期的字符串 |
text_to_be_present_in_element_value | 判断某个元素中的 value 属性是否包含 了预期的字符串 |
frame_to_be_available_and_switch_to_it | 判断该 frame 是否可以 switch进去,如果可以的话,返回 True 并且 switch 进去,否则返回 False |
invisibility_of_element_located | 判断某个元素中是否不存在于dom树或不可见 |
element_to_be_clickable | 判断某个元素中是否可见并且是 enable 的,这样的话才叫 clickable |
staleness_of | 等某个元素从 dom 树中移除,注意,这个方法也是返回 True或 False |
element_to_be_selected | 判断某个元素是否被选中了,一般用在下拉列表 |
element_selection_state_to_be | 判断某个元素的选中状态是否符合预期 |
element_located_selection_state_to_be | 跟上面的方法作用一样,只是上面的方法传入定位到的 element,而这个方法传入 locator |
alert_is_present | 判断页面上是否存在 alert |
示例代码:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC driver = webdriver.Chrome() driver.get('http://www.baidu.com') WebDriverWait(driver, 5, 0.5).until(EC.presence_of_element_located((By.ID, "kw"))) driver.find_element(By.ID, "kw").send_keys("test")
二、元素基本操作
2.1 点击
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC driver = webdriver.Chrome() driver.get('http://www.baidu.com') WebDriverWait(driver, 5, 0.5).until(EC.presence_of_element_located((By.ID, "kw"))) ele = driver.find_element(By.ID, "kw").send_keys("test") # 点击 driver.find_element(By.ID, "su").click() driver.quit()
2.2 输入/清空文本
from time import sleep from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC driver = webdriver.Chrome() driver.get('http://www.baidu.com') WebDriverWait(driver, 5, 0.5).until(EC.presence_of_element_located((By.ID, "kw"))) ele = driver.find_element(By.ID, "kw") # 输入文本 ele.send_keys("test") sleep(1) # 清空输入框文本 ele.clear() driver.quit()
2.3 获取元素尺寸、坐标
from selenium import webdriver from selenium.webdriver.common.by import By driver = webdriver.Chrome() driver.get('http://www.baidu.com') ele = driver.find_element(By.LINK_TEXT, "新闻") print(ele.size) # 获取元素宽高 print(ele.location) # 获取元素x,y坐标值 print(ele.rect) # 获取元素宽高、xy坐标值 driver.quit()
2.4 获取元素标签文本
from selenium import webdriver from selenium.webdriver.common.by import By driver = webdriver.Chrome() driver.get('http://www.baidu.com') ele = driver.find_element(By.LINK_TEXT, "新闻") # 获取元素 text 属性 print(ele.text) driver.quit()
2.5 获取元素属性
from selenium import webdriver from selenium.webdriver.common.by import By driver = webdriver.Chrome() driver.get('http://www.baidu.com') ele = driver.find_element(By.LINK_TEXT, "新闻") print(ele.get_attribute("href")) ele = driver.find_element_by_tag_name("html") # 获取元素标签的内容 # print(ele.get_attribute('textContent')) # # 获取元素内的全部HTML # print(ele.get_attribute('innerHTML')) # 获取包含选中元素的HTML print(ele.get_attribute('outerHTML')) driver.quit()
2.6 检查元素是否可见、可点击等
ele.is_displayed() ele.is_enabled() ele.is_selected()
2.7 获取元素标签类型
ele.tag_name
2.8 表单提交
from selenium import webdriver from selenium.webdriver.common.by import By driver = webdriver.Chrome() driver.get("https://www.baidu.com") ele = driver.find_element_by_id('kw') ele.send_keys('test') ele.submit() # 提交表单,可以模拟在搜索框输入文字后回车的操作 driver.quit()
2.9 指定元素截图
from selenium import webdriver from selenium.webdriver.common.by import By driver = webdriver.Chrome() driver.get("https://www.baidu.com") ele = driver.find_element_by_link_text("新闻") ele.screenshot("test.png") # 截图 driver.quit()
作者:芒果日记
原文链接:https://www.cnblogs.com/sharef/p/13633628.html