4.3 模拟浏览器操作和页面等待(显示等待和隐式等待、句柄)

模拟浏览器操作

  • selenium库提供了模拟浏览器执行一些操作的方法,常用的操作方法如表4-4所示。
    在这里插入图片描述

提示:swith_to用于切换不同窗口或嵌套页面。例如,使用swith_to.window()切换窗口,参数是选项卡的代号(调用windows_handles属性获取当前开启的所有选项卡,返回选项卡的代号列表);当页面存在iframe标签时,使用swith_to.frame()切换到嵌套页面,参数可以直接是标签的id属性或name属性,也可以是定位的节点;使用swith_to.alert()切换到警告框。

  • 在实际的web测试中,会有很多鼠标的操作,不单是只有单击,有时候还要用到右击,双击、拖动等操作。selenium库中的ActionChains类提供了实现这些操作的方法,常用的如表4-5所示。
    在这里插入图片描述
  • 使用ActionChains类初始化对象(如ActionChains(browser)),返回一个ActionChains对象。该对象存储所有用户产生的行为,再通过perform()方法执行这些行为。

SeleniumAPI没有提供某些操作(如下拉滚动条)。在这种情况下,可以直接模拟运行JavaScript,使用execute()方法即可实现。例如,execute_script(“window.scrollTo(0,document.body.scrollHeight)”)实现了将滚动条下拉到页面最底部。

from selenium import webdriver
import time
# 初始化Google Chrome浏览器对象,并赋值给browser
browser = webdriver.Chrome()
# 请求淘宝首页,打开一个浏览器窗口
browser.get('https://www.taobao.com/')
time.sleep(2)
# 通过class 定位“聚划算”节点,并赋值给element
element = browser.find_elements_by_css_selector('.nav-hd li')[2] #因为nav-hd下面有多个li节点,而“聚划算”位于第3个节点
element.click() #单击节点
time.sleep(2) #休眠2s
browser.maximize_window() #窗口最大化
  • 注意第9行代码如果写成
element = browser.find_element_by_css_selector('.nav-hd li')[2]
  • 会出现报错。
    在这里插入图片描述

页面等待

  • 很多网页采用了Ajax技术,程序无法确定某个节点是否已经完全加载。如果页面实际加载的时间过长,会导致程序使用未加载出来的节点,此时就会抛出NullPointer异常。为了避免这种情况,selenium库提供了显示等待和隐式等待方式。

显示等待

  • (1)selenium库提供了WebDriverWait类实现显示等待,WebDriverWait的语法格式如下:
WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions = None)
  • 其中driver表示浏览器对象;timeout表示等待时间;poll_frequency表示检查频率,程序会每隔这个时间检查一次,如果满足条件则会执行下一步,如果不满足条件则继续等待,却省时为0.5s;ignore_exceptions表示超市后的异常信息。
  • WebDriverWait类须与unit()方法或until_not()方法结合使用。例如,WebDriverWait(driver,10).unit(method,message=“”),表示在10s内,每隔0.5s,调用until里的方法,直到它满足了预期条件,如果时间超过10s,则会抛出异常。
  • selenium库的expect_conditions类提供了unit()方法和until_not()方法中预期条件判断的方法,常用的如表4-6所示。
    在这里插入图片描述

隐式等待

  • (2)selenium库直接使用implicitly_wait(timeout)方法实现隐式等待。该方法表示按规定时间内页面的所有元素都加载完了就执行下一步,否则一直等到时间截止,然后再继续下一步。
  • 使用selenium模拟浏览器访问淘宝首页(网址https://www.taobao.com/),使用显示等待判断“聚划算”节点是否加载完成,并输出节点文本。
    在这里插入图片描述

显示等待案例

from selenium import webdriver #导入webdriver模块
from selenium.webdriver.common.by import By #导入By模块
# 导入WebDriverWait模块
from selenium.webdriver.support.ui import WebDriverWait
# 导入excepted_conditions 模块
from selenium.webdriver.support import expected_conditions as EC
# 初始化Google Chrome浏览器对象,并赋值给browser
browser = webdriver.Chrome()
# 请求淘宝首页,打开一个浏览器窗口
browser.get('https://www.taobao.com/')
try:
    # 显式等待10s
    # 判断class属性值为.nav-hd节点下的所有li节点是否加载完成
    element = WebDriverWait(browser,10).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR,'.nav-hd li')))
    print(element[2].text) #输出第三个节点文本,即含有"聚划算"文本的节点
    print('资源加载成功')
except:
    print('资源加载失败')
finally:
    print('清理资源')
    browser.close() #关闭浏览器
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值