zoukankan      html  css  js  c++  java
  • selenium学习之元素等待(四)

    ——为什么要设置元素等待:

      目前大多数web应用程序都是使用AJAX和JavaScript开发,每次加载一个网页,包括静态网页和动态网页,也就是加载各种HTML标签和JS文件。在网页中进行元素定位时,有可能打开了网页但是元素未加载出来,这时进行元素定位可能会出现错误。所以,设置元素等待(等待元素加载完成再去定位)是非常有必要的。

    (1)隐式等待(相当于全局变量)

      隐式等待会告诉webdriver等待一段时间后查找元素。默认等待时间为0,一旦设置了隐式等待,它会对整个webdriver周期起作用。如果在规定时间内,整个网页都加载完成,就执行下一步,否则抛出异常。

            缺点:无论需要定位的元素是否被加载完成,都会等待整个网页完全加载出来。

    1 from selenium import webdriver
    2 
    3 driver = webdriver.Chrome()    # 创建有界面的浏览器对象
    4 driver.implicitly_wait(10)    # 设置隐式等待时间为10秒
    5 driver.get("https://www.baidu.com/")    # 请求页面
    6 input = driver.find_element_by_id("kw")    # 根据id值定位输入框

     (2)显示等待(推荐    相当于局部变量)

      显示等待只对指定元素有效,不再是对整个webdriver周期起作用。根据需要定位的元素来设置显示等待,无需等待整个网页加载完成,节省加载时间。(只需要等待定位元素加载完成)

    设置显示等待的方法:

        WebDriverWait(driver, 超时时间,调用频率,可忽略的异常).until(要采用的方法,超时情况下返回信息)

      调用WebDriverWait方法时,大多情况下只需要设置前两个参数:第一个参数时申明的浏览器对象;第二个参数时设置的最大显示等待时间。调用频率默认0.5s,可忽略的异常默认NoSuchElementException。

      excepted_conditions是selenium中的一个模块,包含一系列用于判断的条件类,一共26个类。其中presence_of_element_located((tuple))传入参数是一个tuple,用于定位元素。 

     1 from selenium import webdriver
     2 from selenium.webdriver.common.by import By    # 用于定位元素
     3 from selenium.webdriver.support.wait import WebDriverWait    # 用于设置显示等待
     4 from  selenium.webdriver.support import expected_conditions as EC    # 用于判断定位元素是否被加载完成
     5 
     6 driver = webdriver.Chrome()    # 创建有界面的浏览器对象
     7 driver.get("https://www.zhihu.com/explore")    # 请求页面
     8 # 设置元素等待实例,最多等待10s,每隔0.5s查看条件是否成立
     9 wait = WebDriverWait(driver, 10)
    10 input = wait.until(EC.presence_of_element_located((By.ID, 'q')))
    11 button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '.btn-search')))
    12 print(input, button)

     ——如果不设置元素等待,可以使用强制等待(调用time模块的sleep方法):

            缺点:无论网页、元素是否被加载完成,都会等待指定时间。

     1 from selenium import webdriver
     2 import time
     3 
     4 driver = webdriver.Chrome()    # 创建有界面的浏览器对象
     5 driver.get("https://www.baidu.com/")    # 请求页面
     6 input = driver.find_element_by_id("kw")    # 根据id值定位输入框
     7 input.send_keys("动物")    # 输入搜索关键字
     8 time.sleep(3)    # 强制等待3秒
     9 input.clear()    # 删除输入内容
    10 input.send_keys("孔雀")    # 重新输入搜索关键字
    11 button = driver.find_element_by_id("su")    # 根据id值定位搜索按钮
    12 button.click()   # 点击
    13 driver.close()    # 关闭页面

     总结:

      (不推荐)强制等待:无论网页、定位元素是否加载完成,都必须等待设置的时长;

      (不推荐)隐式等待:无论定位元素是否加载完成,都必须等待整个网页加载完成;

      (推荐)   显示等待:只需要等待定位元素加载完成。

      

  • 相关阅读:
    dedecms织梦修改标题默认长度
    Python正课68 —— 实现面向对象编程
    Python正课67 —— 面向对象介绍
    Win10系统下提示VMware与Device/Credential Guard不兼容的解决方法
    周考5 月考1 内容
    Python正课66 —— ATM + 购物车 小有成就
    Python正课65 —— ATM + 购物车 架构
    Python正课64 —— re模块
    Python正课63 —— logging模块
    Python正课62 —— subprocess模块
  • 原文地址:https://www.cnblogs.com/chang2021/p/13773940.html
Copyright © 2011-2022 走看看