Python selenium 三种等待方式解读

当使用selenium库对网页进行自动化测试时,由于网络环境、网页内容等因素,可能会出现代码执行速度与页面加载速度不同步的情况,为了解决这个问题,我们需要用到等待机制。

在selenium中,常用的等待方式有三种:隐式等待、显式等待和JavaScript等待。

一、隐式等待

隐式等待是在代码中进行全局设置,一旦设置后,对后续操作都有效。具体实现方式为在创建driver对象后,调用driver对象的implicitly_wait方法,设置等待时间,单位为秒。之后,在执行每个查找元素或者其他操作时,如果元素没有被找到,会等待若干秒再次查找,直到超过设置的等待时间后仍然没有找到元素,就会抛出NoSuchElementException异常。

隐式等待的优点是设置一次后对整个代码都有效,避免了不必要的代码重复,但是有时候效率不够高,因为代码执行速度与网页加载速度可能不一致。

示例1:

from selenium import webdriver

driver = webdriver.Chrome()

# 设置隐式等待时间为10秒
driver.implicitly_wait(10)

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

# 查找输入框
search_input = driver.find_element_by_id("kw")

# 输入搜索内容
search_input.send_keys("Selenium")

# 查找搜索按钮
search_button = driver.find_element_by_id("su")

# 点击搜索按钮
search_button.click()

# 关闭浏览器
driver.quit()

示例2:

from selenium import webdriver

driver = webdriver.Chrome()

# 设置隐式等待时间为10秒
driver.implicitly_wait(10)

# 打开慕课网首页
driver.get("https://www.imooc.com")

# 查找所有课程元素
courses = driver.find_elements_by_css_selector(".course-card-container .course-card")

# 打印课程数量
print("共有{0}门课程".format(len(courses)))

# 关闭浏览器
driver.quit()

二、显式等待

显式等待是在代码中进行局部设置,就是在代码的特定位置等待某一条件出现。通过调用WebDriverWait对象的until或者until_not方法,指定需要等待的条件,如出现某个元素,然后设置最长等待时间,单位为秒。

具体实现方式为先定义一个WebDriverWait对象,然后调用expected_conditions模块中的一些预定义条件,比如element_to_be_clickable(查找元素并且该元素可被点击)等,此外,也可以自定义等待条件方法。然后通过调用这个对象的until或until_not方法来等待条件成立或者超时。

显式等待的优点是灵活性高,可以在特定的位置等待,而且可以手动设置等待条件,缺点是容易产生代码冗余。

示例1:

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

driver = webdriver.Chrome()

# 打开慕课网登录页面
driver.get("https://www.imooc.com/user/newlogin")

# 定义WebDriverWait对象,最长等待时间为10秒
wait = WebDriverWait(driver, 10)

# 等待页面中的登录方式出现
login_type = wait.until(EC.presence_of_element_located((By.CLASS_NAME, "js-loginTab-item.loginTab-item")))

# 点击切换登录方式按钮
login_type.click()

# 关闭浏览器
driver.quit()

示例2:

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

driver = webdriver.Chrome()

# 打开百度搜索页面
driver.get("https://www.baidu.com/s?ie=utf-8&wd=selenium")

# 定义WebDriverWait对象,最长等待时间为10秒
wait = WebDriverWait(driver, 10)

# 等待搜索结果元素列表出现
results = wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "#content_left .result.c-container")))

# 打印搜索结果数量
print("共找到{0}个搜索结果".format(len(results)))

# 关闭浏览器
driver.quit()

三、JavaScript等待

JavaScript等待是通过执行一段JavaScript代码来等待某个条件的出现。具体实现方式为调用execute_script方法,然后在传入的JavaScript代码中实现等待条件,调用window.setTimeout方法实现等待,返回结果是一个jQuery对象。

JavaScript等待的优点是自由度高,可以通过自定义JavaScript实现各种等待条件,缺点是需要熟悉JavaScript语法。

示例1:

from selenium import webdriver

driver = webdriver.Chrome()

# 打开百度搜索页面
driver.get("https://www.baidu.com")

# 等待两秒钟
driver.execute_script("window.setTimeout(function() { return true; }, 2000);")

# 查找输入框
search_input = driver.find_element_by_id("kw")

# 输入搜索内容
search_input.send_keys("Selenium")

# 查找搜索按钮
search_button = driver.find_element_by_id("su")

# 点击搜索按钮
search_button.click()

# 关闭浏览器
driver.quit()

示例2:

from selenium import webdriver

driver = webdriver.Chrome()

# 打开慕课网首页
driver.get("https://www.imooc.com")

# 等待三秒钟
driver.execute_script("window.setTimeout(function() { return true; }, 3000);")

# 查找所有课程元素
courses = driver.find_elements_by_css_selector(".course-card-container .course-card")

# 打印课程数量
print("共有{0}门课程".format(len(courses)))

# 关闭浏览器
driver.quit()

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python selenium 三种等待方式解读 - Python技术站

(0)
上一篇 2023年5月14日
下一篇 2023年5月14日

相关文章

  • Python+Tkinter制作专属图形化界面

    让我们开始讲解“Python+Tkinter制作专属图形化界面”的完整攻略。 1. Tkinter组件介绍 Tkinter 是 Python 自带的 GUI 库,可以方便地创建简单的窗口应用程序。在使用这个库前,需要导入它的模块。 导入模块语句:import tkinter as tk Tkinter 中一些常用的组件如下: 标签(Label):用于显示文本…

    python 2023年6月13日
    00
  • odoo 开发入门教程系列-继承(Inheritance)

    继承(Inheritance) Odoo的一个强大方面是它的模块化。模块专用于业务需求,但模块也可以相互交互。这对于扩展现有模块的功能非常有用。例如,在我们的房地产场景中,我们希望在常规用户视图中直接显示销售人员的财产列表。 在介绍特定的Odoo模块继承之前,让我们看看如何更改标准CRUD(创建、检索,更新或删除)方法的行为 Python继承(Python …

    python 2023年4月17日
    00
  • Python实现自定义异常堆栈信息的示例代码

    以下是关于Python实现自定义异常堆栈信息的示例代码的完整攻略: 问题描述 在Python中,异常堆栈信息可以帮助我们更好地理程序运行时错误。有时候,我们需要自定义异常堆栈信息,以便更好地调试程序。 解决方法 可以以下步骤在Python中实现自定义异常堆栈信息: 创建自定义异常类。 在Python中,可以创建自定义异常类。自定义异常可以继承Exceptio…

    python 2023年5月13日
    00
  • 详解Python 如何写多行语句

    Python中,我们可以通过一些方式实现多行语句的书写,这样可以方便我们对大段代码进行格式的整理和调整。以下是多种实现多行语句书写的方法。 1. 使用反斜杠\连接 在Python中,\符号可以用来将一行代码连接到下一行,实现多行代码书写。这种方式比较直观,可以方便地查看每一行代码的具体内容。 示例代码: print("hello \ world \…

    python-answer 2023年3月25日
    00
  • Python实现提前查询考研成绩功能

    下面我将详细讲解Python实现提前查询考研成绩功能的完整攻略,步骤如下: 步骤一:获取成绩查询的地址 首先需要获取成绩查询的地址,可以在官方网站上找到。以清华大学为例,成绩查询入口网址为:http://yz.tsinghua.edu.cn/scs/login.jsp。 步骤二:模拟用户登录 在获取成绩查询的地址后,需要模拟用户登录,才能够获取到自己的成绩。…

    python 2023年6月3日
    00
  • Android中父View和子view的点击事件处理问题探讨

    让我来为您详细讲解“Android中父View和子view的点击事件处理问题探讨”的攻略。 1. 父View和子View的点击事件的区别 在 Android 开发中,我们可以为View设置点击事件,但是在存在父View和子View的情况下,点击事件会存在一些问题。如果同时在父View和子View上都设置了点击事件,点击子View时只会触发子View的点击事件…

    python 2023年6月13日
    00
  • Python Pyperclip模块安装和使用详解

    Python Pyperclip模块安装和使用详解 Pyperclip 是一个 Python 模块,它允许你复制和粘贴文本到操作系统的剪贴板上。 安装Pyperclip 在安装 Pyperclip 之前,需要安装 Python 环境,并确保 pip 已经被安装。 Windows用户 在命令提示符上执行以下命令: python -m pip install p…

    python 2023年5月14日
    00
  • python3访问sina首页中文的处理方法

    下面是Python3访问Sina首页中文的处理方法的完整攻略,包括以下步骤: 1. 安装所需库 在Python3中,我们推荐使用requests库来访问网页。因此,首先需要在本地安装requests库。可在命令行中使用以下命令进行安装: pip install requests 2. 发送HTTP请求 使用requests库发送HTTP请求的代码如下: im…

    python 2023年6月3日
    00
合作推广
合作推广
分享本页
返回顶部