元素等待的三种方式
强制等待
time.sleep()
隐性等待
driver.implicitly_wait()
- 全局设置
- 超过超时时间会报错
- 只能用来等待元素
显性等待 (难点、重点)
#第一步:设置定时起
wait = WebDriverWait(driver,20,poll_frequency=0.5)`
#第二步:设置满足的条件
wait.until( expected_conditions.presence_of_element_located(
locator=('xpath','//*[text()="lemon.ke.qq.com/"]')) )
1. 等待某个元素可以被点击
2. 等待某个窗口被打开
3. 等待某个元素可见
4. 显性等待不是全局设置
- 显性等待几个重要的条件
- presence_of_element_located(locator) 元素是否出现
- visibility_of_element_located(locator) 元素是否可见
- element_to_be_clickable(locator) 元素是否可以被点击
- 显性等待找不到元素报错:TimeoutException
等待方式的选择
- 隐性等待:全局设置,等待查找元素 ,优先用
- 显性等待:等待元素可以被点击、可见
- 强制等待:多个系统交互的地方(文件上传,js代码上传)一般情况不用,隐性等待和显性等待都用不了时,在用强制等待
元素无法找到的原因
- NosuchElement
- 检查元素定位方式是否正确
- 没有等待
- 检查有没有在该浏览窗口
- 检查是否在一个iframe当中
窗口切换
窗口切换
#窗口切换,需要先获取窗口句柄
print(driver.window_handles)
#-1表示切换到最后一个网页窗口
driver.switch_to.window(driver.window_handles[-1])
iframe切换
- 需要先确认网页中是否有iframe’
#先找到要切换的iframe
iframe_elme = driver.fine_element_by_xpat('//iframe[@src]')
driver.switch_to.frame(iframe_elme)
#切换到默认的HTML
driver.switch_to.default_content()
#切换到上一级iframe
driver.switch_to.parent_frame()
#iframe 等待
WebDriverWait(driver,30,poll_frequency=0.5).until(
expected_conditions.frame_to_be_available_and_switch_to_it(iframe_elem))
alert切换
- 弹窗定位
#切换 alert
malert = driver.switch_to.alert
#点击确认按钮
malert.accept()
#点击取消按钮
malert.dismiss()
#alert等待方法
WebDriverWait(driver,30,poll_frequency=0.5).until(
expected_conditions.alert_is_present(iframe_elem))