Python爬虫(四)- Selenium 安装与使用教程

打印 上一主题 下一主题

主题 871|帖子 871|积分 2613


前言

随着Web应用的日益复杂和普及,确保其质量和用户体验变得至关紧张。自动化测试作为软件开辟周期中不可或缺的一部分,能够有效提高测试效率、减少人为错误,并加速产品的迭代过程。Selenium作为业界领先的Web应用测试工具,提供了一套强大的API,支持多种编程语言,使得开辟者和测试职员可以轻松地编写自动化测试脚本以模拟用户交互。
本文旨在为读者提供一个全面且详细的指南,资助你从零开始学习并掌握Selenium的基础知识及其高级功能。无论你是刚开始接触自动化测试的新手,还是希望深入理解Selenium工作机制的经验丰富的开辟者,本书都将为你提供所需的知识和技术细节。我们将从Selenium的基本概念入手,逐步介绍如何安装设置情况,以及如何使用Selenium进行Web页面的基本操纵,如启动欣赏器、打开网页、元素查找与操纵等。
别的,本文还将探讨一些更高级的主题,包罗但不限于:处理各种类型的表单元素(如复选框、单选框、下拉菜单)、执行复杂的鼠标和键盘操纵、文件上传下载、等候机制的应用、欣赏器级别的操纵(如窗口管理、Cookie操纵)、以及无头模式的设置等。每个章节都配有详细的示例代码,以便于读者更好地理解和实践所学内容。

一、简介及安装

1. Selenium 简介

Selenium是一个强大的工具集,主要用于自动化Web欣赏器的操纵,非常适合于Web应用程序的测试。它通过直接控制欣赏器来执行测试脚本,支持多种编程语言,好比Java、C#、Python等,从而可以模拟用户的实际操纵如点击按钮、填写表单等。Selenium不仅限于某一种操纵体系或欣赏器,因此它是跨平台和跨欣赏器测试的抱负选择。
Selenium的一个紧张组成部分是Selenium WebDriver,它提供了与欣赏器直接交互的本领,让开辟者能够编写出模仿真实用户行为的测试用例。别的,Selenium IDE作为一个Chrome和Firefox的插件,为那些希望快速创建测试脚本而无需编写代码的人提供了一个图形界面。通过记录和回放用户在欣赏器中的操纵,Selenium IDE简化了测试脚本的天生过程。
对于必要在多个情况上运行测试的情况,Selenium Grid提供了解决方案。它可以让你在同一测试套件中针对差别的操纵体系和欣赏器组合并行地运行测试,大大减少了总的测试时间。
Selenium因为其开源免费、拥有广泛社区支持以及几乎支持全部主流编程语言和欣赏器的特点而受到欢迎。它可以非常传神地模仿最终用户的行为,这使得它成为进行功能测试、回归测试等方面的抱负选择。不过,对于初学者来说,可能必要一些时间来熟悉其工作流程,而且在处理动态内容或复杂的JavaScript驱动的应用程序时,偶尔也必要额外的努力来确保测试的稳定性和可靠性。总之,Selenium是一个非常灵活且强大的Web测试工具。
2. Selenium 安装

对于Python用户,可以通过pip(Python包管理工具)来安装Selenium。
运行以下下令来安装Selenium:
  1. pip install selenium -i https://mirrors.aliyun.com/pypi/simple/
复制代码

二、Selenium 基本使用

1. 导入Selenium

首先必要导入Selenium库中的相干模块。这里主要用到的是webdriver模块,它允许我们与欣赏器进行交互。
  1. from selenium import webdriver
复制代码
2. 启动欣赏器

  1. driver = webdriver.Edge()
复制代码
3. 打开网页

使用get方法导航到特定的URL。
  1. driver.get('https://www.baidu.com')
复制代码
4. 获取页面标题

要获取当前页面的标题,可以使用title属性。
  1. print(driver.title)
复制代码
5. 关闭欣赏器

完成全部操纵后,通过调用quit()方法来关闭欣赏器,竣事WebDriver会话。
  1. driver.quit()
复制代码
6. 完整示例代码

  1. from selenium import webdriver
  2. driver = webdriver.Edge()
  3. driver.get('https://www.baidu.com')
  4. print(driver.title)
  5. driver.quit()
复制代码

三、Selenium WebDriver

1. 简介

Selenium WebDriver 是 Selenium 工具套件的一部分,用于自动化Web欣赏器的操纵。与 Selenium IDE 差别,WebDriver 提供了编程接口,允许用户使用他们选择的编程语言(如 Python、Java、C# 等)来创建测试脚本。WebDriver 通过直接控制欣赏器的行为,能够更灵活和准确地模拟真实用户的交互,支持多种欣赏器包罗 Chrome、Firefox、Edge 和 Safari 等。
2. 基本操纵

2.1 启动欣赏器

在开始使用 WebDriver 前,必要根据使用的编程语言导入相应的库,并启动对应的欣赏器实例。
  1. from selenium import webdriver
  2. # 启动Edge欣赏器driver = webdriver.Edge()
  3. # 启动Chrome欣赏器# driver = webdriver.Chrome()# 启动Firefox欣赏器# driver = webdriver.Firefox()# 启动Safari欣赏器# driver = webdriver.Safari()# 启动Ie欣赏器# driver = webdriver.Ie()
复制代码
2.2 关闭欣赏器

  1. driver.quit()
复制代码
2.3 打开网页

使用 get 方法导航到特定的 URL。
  1. driver.get('https://www.baidu.com')
复制代码
2.4 关闭当前网页

  1. driver.close()
复制代码
2.5 最大化窗口

  1. driver.maximize_window()
复制代码
2.6 最小化窗口

  1. driver.minimize_window()
复制代码
2.7 全屏模式

  1. driver.fullscreen_window()
复制代码
2.8 页面进步和后退

  1. # 打开百度网页driver.get('https://www.baidu.com')
  2. # 打开搜狗网页driver.get('https://www.sogou.com')# 返回百度driver.back()# 进步到搜狗driver.forward()
复制代码
2.9 页面刷新

  1. driver.refresh()
复制代码
2.10 获取页面标题

  1. title = driver.title
复制代码
2.11 获取当前页面URL

  1. url = driver.current_url
复制代码
3. 元素查找

在使用Selenium进行Web自动化测试时,元素定位是非常关键的一个步骤。准确地定位到页面上的元素是执行点击、输入文本等交互操纵的条件。Selenium提供了多种方法来定位页面中的元素,下面介绍这些方法。
3.1 通过ID查找

如果页面元素具有唯一的id属性,那么这是最简单和保举的方式之一。每个元素的id应该是独一无二的。
  1. element = driver.find_element(By.ID, "element_id")
复制代码
3.2 通过Name查找

如果元素没有id或想通过name属性来定位,可以使用这种方法。不过,一个页面中可能存在多个相同name的元素。
  1. element = driver.find_element(By.NAME, "element_name")
复制代码
3.3 通过Class Name查找

可以通过元素的class属性来定位元素。留意,如果多个元素共享相同的类名,则此方法可能返回多个匹配项。
  1. elements = driver.find_elements(By.CLASS_NAME, "class_name")  # 返回一个列表
复制代码
3.4 通过Tag Name查找

根据HTML标签名(如<div>、<a>)来查找元素。通常用于获取一组类似元素。
  1. elements = driver.find_elements(By.TAG_NAME, "tag_name")  # 返回所有匹配的元素列表
复制代码
3.5 通过Link Text查找

适用于定位链接(<a>标签)。可以根据链接文本准确匹配。
  1. element = driver.find_element(By.LINK_TEXT, "link_text")
复制代码
3.6 通过Partial Link Text查找

与LINK_TEXT类似,但是允许部分匹配链接文本。
  1. element = driver.find_element(By.PARTIAL_LINK_TEXT, "partial_link_text")
复制代码
3.7 通过CSS选择器查找

CSS选择器是一种非常强大且灵活的方式来定位元素。它可以基于元素的ID、类、类型、属性等进行定位。
  1. element = driver.find_element(By.CSS_SELECTOR, "css_selector")
复制代码
例如,要找到一个拥有特定类的按钮,可以这样写:
  1. element = driver.find_element(By.CSS_SELECTOR, ".button_class")
复制代码
3.8 通过XPath查找

XPath是一种在XML文档中查找信息的语言,同样适用于HTML文档。它能够以复杂的方式定位元素,包罗层级关系、属性值等。
  1. element = driver.find_element(By.XPATH, "xpath_expression")
复制代码
例如,要找到一个具有特定属性值的输入框,可以这样写:
  1. element = driver.find_element(By.XPATH, "//input[@type='text' and @name='username']")
复制代码
3.9 示例代码

编写测试的html代码,并保存为demo.html文件。
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <title>Selenium Test Page</title>
  6. </head>
  7. <body>
  8. <h1 id="mainTitle">欢迎来到Selenium测试页面</h1>
  9. <!-- 通过ID查找 -->
  10. <input type="text" id="searchBox" placeholder="输入搜索关键词">
  11. <!-- 通过Name查找 -->
  12. <input type="password" name="pwd" placeholder="请输入密码">
  13. <!-- 通过Class Name查找 -->
  14. <button class="btn-submit">提交</button>
  15. <button class="btn-reset">重置</button>
  16. <!-- 通过Tag Name查找 -->
  17. <p>这是一个段落。</p>
  18. <p>这是另一个段落。</p>
  19. <!-- 通过Link Text查找 -->
  20. <a href="https://www.example.com" target="_blank">更多示例</a>
  21. <!-- 通过Partial Link Text查找 -->
  22. <a href="https://www.selenium.dev" target="_blank">访问Selenium官网</a>
  23. <!-- 通过CSS选择器查找 -->
  24. <div class="content-box">
  25.     <p>这是一个使用CSS选择器可定位的内容。</p>
  26. </div>
  27. <!-- 通过XPath查找 -->
  28. <form>
  29.     <label for="firstName">名字:</label>
  30.     <input type="text" id="firstName" name="firstName"><br><br>
  31.     <label for="lastName">姓氏:</label>
  32.     <input type="text" id="lastName" name="lastName"><br><br>
  33.     <input type="submit" value="提交表单">
  34. </form>
  35. <script>
  36.     // JavaScript代码可以在这里添加,用于动态生成内容或处理用户交互
  37. </script>
  38. </body>
  39. </html>
复制代码
Selenium 示例代码如下:
  1. from selenium import webdriver
  2. from selenium.webdriver.common.by import Bydriver = webdriver.Edge()
  3. try:    # 打开测试页面    driver.get(r"D:\ProjectCode\untitled\selenium\demo.html")    # 通过ID查找元素    element_by_id = driver.find_element(By.ID, "mainTitle")    print("找到通过ID定位的元素:", element_by_id.text)    # 通过Name查找元素    element_by_name = driver.find_element(By.NAME, "pwd")    print("找到通过Name定位的元素:", element_by_name.get_attribute('placeholder'))    # 通过Class Name查找元素    elements_by_class_name = driver.find_elements(By.CLASS_NAME, "btn-submit")    print("找到通过Class Name定位的元素:", elements_by_class_name)    # 通过Tag Name查找元素    elements_by_tag_name = driver.find_elements(By.TAG_NAME, "p")    print("找到通过Tag Name定位的元素:", elements_by_tag_name)    # 通过Link Text查找元素    element_by_link_text = driver.find_element(By.LINK_TEXT, "更多示例")    print("找到通过Link Text定位的元素:", element_by_link_text)    # 通过Partial Link Text查找元素    element_by_partial_link_text = driver.find_element(By.PARTIAL_LINK_TEXT, "访问Selenium官网")    print("找到通过Partial Link Text定位的元素:", element_by_partial_link_text)    # 通过CSS Selector查找元素    element_by_css_selector = driver.find_element(By.CSS_SELECTOR, ".content-box")    print("找到通过CSS Selector定位的元素文本:", element_by_css_selector.text)    # 通过XPath查找元素    element_by_xpath = driver.find_element(By.XPATH, "//input[@id='firstName']")    print("找到通过XPath定位的元素:", element_by_xpath)finally:    # 关闭欣赏器    driver.quit()
复制代码
打印结果如下图所示:

4. 元素操纵

4.1 输入文本

向输入框中输入文本可以使用send_keys()方法。
  1. input_box = driver.find_element(By.NAME, 'wd')
  2. input_box.send_keys('风景图片')
复制代码
4.2 点击元素

点击操纵是最常用的交互之一,可以通过click()方法来实现。
  1. element = driver.find_element(By.ID, "su")
  2. element.click()
复制代码
4.3 清除输入框文本

在输入文本之前,可能必要先清除输入框中的默认文本或已有内容,这时可以使用clear()方法。
  1. input_box.clear()
复制代码
4.4 获取和设置属性值



  • 获取属性值:可以使用get_attribute()方法来获取元素的特定属性值。
    1. value = element.get_attribute('value')
    复制代码
  • 设置属性值(通常不直接通过Selenium进行,但可以通过JavaScript执行):
    1. driver.execute_script("arguments[0].setAttribute('attribute_name', 'attribute_value')", element)
    复制代码
4.5 获取文本内容

获取元素内部的文本内容可以使用text属性。
  1. setting = driver.find_element(By.CSS_SELECTOR, '#u > a.pf')
  2. setting_text = setting.text
复制代码
4.6 判定元素是否可见、启用状态等



  • 判定元素是否显示:使用is_displayed()方法检查元素是否对用户可见。
    1. if element.is_displayed():
    2.     print("元素是可见的")
    复制代码
  • 判定元素是否启用:使用is_enabled()方法检查元素是否处于可用状态(例如按钮是否可点击)。
    1. if element.is_enabled():
    2.     print("元素是启用状态")
    复制代码
  • 判定复选框或单选按钮是否被选中:使用is_selected()方法检查复选框或单选按钮的状态。
    1. if element.is_selected():
    2.     print("元素已被选中")
    复制代码
4.7 复选框和单选框操纵

4.7.1 复选框操纵

  1. # 使用ID定位方式查找页面上的复选框元素(假设其ID为"checkbox-id")
  2. checkbox_element = driver.find_element(By.ID, "checkbox-id")
  3. # 检查该复选框是否未被选中
  4. if not checkbox_element.is_selected():
  5.     # 如果复选框未被选中,则点击它以选中
  6.     checkbox_element.click()
复制代码
4.7.2 单选框操纵

  1. # 通过ID定位方式查找页面上的单选按钮元素(这里假设其ID为"radio-button-id")
  2. radio_button_element = driver.find_element(By.ID, "radio-button-id")
  3. # 检查该单选按钮是否未被选中
  4. if not radio_button_element.is_selected():
  5.     # 如果单选按钮未被选中,则点击它以选中
  6.     radio_button_element.click()
复制代码
4.8 下拉选择框操纵

  1. # 从selenium.webdriver.support.ui模块导入Select类,用于处理下拉选择框
  2. from selenium.webdriver.support.ui import Select
  3. # 使用ID定位方式查找页面上的下拉菜单元素(这里假设其ID为"dropdown-id")
  4. dropdown_element = driver.find_element(By.ID, "dropdown_id")
  5. # 使用找到的下拉菜单元素初始化一个Select对象,以便使用Select类提供的便捷方法来操作下拉菜单
  6. select = Select(dropdown_element)
  7. # 根据显示的文本选择选项。这里选择显示文本为"选项1"的选项
  8. select.select_by_visible_text("选项1")
  9. # 根据选项的value属性值选择选项。这里选择value属性值为"1"的选项
  10. select.select_by_value("1")
  11. # 根据选项在下拉列表中的索引位置选择选项。这里选择索引为0的第一个选项(索引从0开始计数)
  12. select.select_by_index(0)
复制代码
4.9 滚动到元素位置

偶尔必要滚动页面直到某个元素进入视图中,这可以通过JavaScript执行来完成。
  1. driver.execute_script("arguments[0].scrollIntoView(true);", element)
复制代码
4.10 截图

可以对整个页面或特定元素进行截图保存。


  • 对整个页面截图
    1. driver.save_screenshot('screenshot.png')
    复制代码
  • 对特定元素截图
    1. element.screenshot('element_screenshot.png')
    复制代码
4.11 鼠标操纵

在Selenium中,鼠标操纵是通过ActionChains类来实现的。这个类提供了一系列的方法来模拟各种鼠标操纵,如点击、双击、右击、拖拽等。
以下是一些常见的鼠标操纵及其使用方法:

  • 导入ActionChains
    在执行任何鼠标操纵之前,首先必要从selenium.webdriver.common.action_chains模块中导入ActionChains类。
    1. from selenium.webdriver.common.action_chains import ActionChains
    复制代码
  • 初始化ActionChains对象
    创建一个ActionChains对象,该对象必要传入一个欣赏器驱动实例。
    1. actions = ActionChains(driver)
    复制代码
  • 常用鼠标操纵

    • 点击(Click): 点击一个元素。
      1. element = driver.find_element(By.ID, "element_id")
      2. actions.click(element).perform()
      复制代码
    • 右键点击(Context Click): 在某个元素上执行右键点击。
      1. element = driver.find_element(By.ID, "element_id")
      2. actions.context_click(element).perform()
      复制代码
    • 双击(Double Click): 双击一个元素。
      1. element = driver.find_element(By.ID, "element_id")
      2. actions.double_click(element).perform()
      复制代码
    • 悬停(Move to Element): 将鼠标移动到某个元素上。
      1. element = driver.find_element(By.ID, "element_id")
      2. actions.move_to_element(element).perform()
      复制代码
    • 拖放(Drag and Drop): 从一个位置拖动元素并释放到另一个位置。
      1. source_element = driver.find_element(By.ID, "source_id")
      2. target_element = driver.find_element(By.ID, "target_id")
      3. actions.drag_and_drop(source_element, target_element).perform()
      复制代码

  • 执行动作
    全部的动作链都必要通过调用.perform()方法来执行。这意味着你可以先定义一系列的动作,然后一次性执行它们。
  • 链式调用
    ActionChains支持链式调用,即可以连续调用多个方法,最后通过.perform()来执行全部动作。
    1. actions.move_to_element(element).click().double_click().context_click().perform()
    复制代码
4.12 键盘操纵

在Selenium中,键盘操纵主要通过ActionChains类和send_keys方法来实现。这些工具允许你模拟各种键盘输入变乱,包罗简单的文本输入以及组合键的使用。
以下是一些常见的键盘操纵及其使用方式:
4.12.1 使用 send_keys 输入文本

直接向一个元素发送文本输入是最基本的键盘操纵之一。这通常用于输入框、文本域等元素。
  1. element = driver.find_element(By.ID, "input_field_id")
  2. element.send_keys("Hello, World!")
复制代码
4.12.2 使用 ActionChains 执行复杂键盘操纵

对于更复杂的键盘操纵(如按下或释放特定按键),可以使用ActionChains类。


  • 导入 ActionChains:
    1. from selenium.webdriver.common.action_chains import ActionChains
    2. from selenium.webdriver.common.keys import Keys
    复制代码
  • 执行组合键操纵:
    好比要执行Ctrl+A(全选)和Ctrl+C(复制)这样的组合键操纵:
    1. actions = ActionChains(driver)
    2. # 开始构建一系列的键盘操纵:# 首先按下Ctrl键不放# 然后发送'a'键模拟全选操纵(Ctrl+A)# 最后释放Ctrl键actions.key_down(Keys.CONTROL).send_keys('a').key_up(Keys.CONTROL).perform()actions.key_down(Keys.CONTROL).send_keys('c').key_up(Keys.CONTROL).perform()
    复制代码
  • 其他常见操纵:

    • 按下并释放某个键:
      1. actions = ActionChains(driver)
      2. actions.send_keys(Keys.ENTER).perform() # 按下回车键
      复制代码
    • 按住Shift键并输入:
      1. actions = ActionChains(driver)
      2. actions.key_down(Keys.SHIFT).send_keys('hello').key_up(Keys.SHIFT).perform()
      复制代码

4.12.3 特别键支持

Selenium通过Keys类提供了多种特别键的支持,好比Keys.RETURN(回车键)、Keys.TAB(Tab键)、Keys.ESCAPE(Esc键)等,你可以根据必要选择符合的特别键进行操纵。
特别键描述Keys 类常量回车键(Enter)Keys.RETURN 或 Keys.ENTERTab 键Keys.TABEsc 键Keys.ESCAPE空格键Keys.SPACE向上方向键Keys.ARROW_UP 或 Keys.UP向下方向键Keys.ARROW_DOWN 或 Keys.DOWN向左方向键Keys.ARROW_LEFT 或 Keys.LEFT向右方向键Keys.ARROW_RIGHT 或 Keys.RIGHT删除键(Delete)Keys.DELETE退格键(Backspace)Keys.BACK_SPACE插入键(Insert)Keys.INSERTHome 键Keys.HOMEEnd 键Keys.ENDPage Up 键Keys.PAGE_UPPage Down 键Keys.PAGE_DOWNF1 至 F12 功能键Keys.F1 至 Keys.F12Ctrl 键Keys.CONTROLShift 键Keys.SHIFTAlt 键Keys.ALT 4.13 文件上传和下载操纵

在Selenium中,处理文件上传和下载是Web自动化测试的紧张组成部分。下面将分别介绍如何使用Selenium进行文件上传和下载的操纵。
4.13.1 文件上传

对于文件上传操纵,通常涉及到与网页上的文件输入元素(<input type="file">)交互。以下是实现步骤:

  • 定位文件输入元素:
    使用适当的定位策略(如ID、名称等)找到页面上的文件输入框。
    1. file_input = driver.find_element(By.ID, "fileUploadId")
    复制代码
  • 发送文件路径:
    利用send_keys方法向该元素发送要上传的文件的完整路径。
    1. file_input.send_keys("/path/to/your/file.txt")
    复制代码
示例代码:
  1. from selenium import webdriver
  2. from selenium.webdriver.common.by import Bydriver = webdriver.Chrome()  # 或其他WebDriverdriver.get("http://example.com/upload")  # 打开目的网页# 定位文件上传输入框并发送文件路径file_input = driver.find_element(By.ID, "fileUploadId")
  3. file_input.send_keys("/absolute/path/to/your/file.txt")# 可以继续执行提交表单或其他操纵
复制代码
4.13.2 文件下载

Selenium本身并不直接支持文件下载的管理,因为它是计划用来模拟用户与网页交互的工具,而不是用于处理欣赏器下载行为的。然而,可以通过以下几种方式来间接实现文件下载功能:

  • 设置欣赏器设置
    在启动欣赏器之前,可以设置欣赏器的偏好设置或选项来自动下载某些类型的文件到指定位置,而无需提示。

    • Chrome 示例:
      1. from selenium import webdriver
      2. from selenium.webdriver.chrome.options import Options# 初始化Options对象,用于设置Chrome(或Edge)欣赏器的启动参数chrome_options = Options()# 设置欣赏器偏好设置prefs = {    # 指定默认的文件下载路径。请确保路径存在且程序有权限写入。    "download.default_directory": "/path/to/download/directory",    # 设置为False以禁用下载提示框,这样文件会自动下载到默认目次而不扣问用户。    "download.prompt_for_download": False,    # 提供升级下载目次的资助程序,通常保持为True即可。    "download.directory_upgrade": True,    # 启用安全欣赏保护。根据需求启用或禁用。    "safebrowsing.enabled": True}# 将偏好设置添加到chrome_options中chrome_options.add_experimental_option("prefs", prefs)driver = webdriver.Chrome(options=chrome_options)# 打开包罗文件下载链接的目的网页driver.get("http://example.com/download")
      复制代码

  • 触发下载动作
    通过点击下载链接或按钮来触发文件下载。由于已经设置了下载目次,文件将会自动下载到指定位置。
    1. download_link = driver.find_element(By.ID, 'downloadLink')
    2. download_link.click()
    复制代码
  • 检查文件是否成功下载
    下载完成后,可能必要额外的逻辑来验证文件是否已成功下载,好比检查文件是否存在、巨细是否符合预期等。
4.14 等候机制

在使用Selenium进行Web自动化测试时,等候机制是确保脚本稳定性和可靠性的关键因素之一。由于页面加载和元素渲染的时间可能差别,直接操纵未完全加载的元素会导致错误。Selenium提供了两种主要的等候机制:隐式等候和显式等候。
4.14.1 隐式等候 (Implicit Wait)

隐式等候是对整个WebDriver会话设置的一个全局等候时间。如果在指定时间内网页没有加载完成或特定元素尚未出现,WebDriver将继续轮询DOM,直到元素变得可用或超时。


  • 如何使用:
    1. from selenium import webdriver
    2. driver = webdriver.Chrome()  # 或其他WebDriver实例# 设置隐式等候时间为10秒driver.implicitly_wait(10)  # 参数为等候的秒数
    复制代码
  • 优点: 简单易用,只需设置一次即可应用于全部查找元素的操纵。
  • 缺点: 如果页面上的某些元素比设定的时间更早出现,仍需等候至设定的最大时间,可能导致不须要的延迟。
4.14.2 显式等候 (Explicit Wait)

显式等候允许针对特定条件进行等候,只有当该条件满足时才会继续执行后续代码,或者在超过最大等候时间后抛出异常。这种方式更加灵活且高效。


  • 常用方法:

    • WebDriverWait: 结合ExpectedConditions用于检查特定条件是否建立。

  • 示例代码:
    1. from selenium import webdriver
    2. from selenium.webdriver.common.by import Byfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECdriver = webdriver.Chrome()  # 或其他WebDriver实例driver.get("http://example.com")try:    # 使用WebDriverWait等候最多10秒,直到找到ID为'element_id'的元素    element = WebDriverWait(driver, 10).until(        EC.presence_of_element_located((By.ID, "element_id"))    )finally:    driver.quit()
    复制代码
  • 常用的ExpectedConditions:

    • presence_of_element_located: 检查元素是否存在于DOM中。
    • visibility_of_element_located: 检查元素是否可见。
    • element_to_be_clickable: 检查元素是否可见并且可点击。
    • alert_is_present: 检查是否存在一个警告框。

4.14.3 手动等候 (Thread Sleep)

虽然可以使用Python的time.sleep()方法来实现简单的线程休眠作为等候本领,但这通常不是最佳实践,因为它会造成固定的等候时间,无论实际必要与否,可能会增加不须要的测试运行时间。


  • 不保举的方式:
    1. import time
    2. time.sleep(5)  # 强制等待5秒
    复制代码
4.15 欣赏器操纵

Selenium不仅可以操纵网页元素,还可以控制欣赏器本身的行为。
4.15.1 常用欣赏器操纵方法

操纵类型方法阐明打开新窗口execute_script("window.open('URL');") 使用JavaScript打开新窗口。切换窗口switch_to.window(window_handle) 切换到指定的窗口句柄。关闭窗口close() 关闭当前窗口。最大化窗口maximize_window() 最大化欣赏器窗口。设置窗口巨细set_window_size(width, height) 设置欣赏器窗口的巨细。全屏模式fullscreen_window() 将欣赏器窗口设置为全屏模式。打开网页get(url) 打开指定的URL。进步和后退back() 和 forward() 返回上一个页面或进步到下一个页面。刷新页面refresh() 刷新当前页面。处理Alert弹窗switch_to.alert 结合 accept() 或 dismiss() 处理Alert弹窗,点击确认或取消。添加Cookieadd_cookie(cookie_dict) 添加指定的Cookie。获取Cookieget_cookie(name) 或 get_cookies() 获取指定Cookie或全部Cookies。删除Cookiedelete_cookie(name) 或 delete_all_cookies() 删除指定Cookie或全部Cookies。执行JavaScriptexecute_script(script) 执行指定的JavaScript代码。 4.15.2 示例代码

以下是一些详细的示例代码,演示了如何进行上述操纵。
4.15.2.1 处理欣赏器弹窗(alert、confirm、prompt)

  1. from selenium import webdriver
  2. from selenium.webdriver.common.alert import Alertdriver = webdriver.Chrome()# 打开网页driver.get("https://example.com")# 触发 alert 弹窗driver.execute_script("alert('这是一个 alert 弹窗');")# 切换到 alert 弹窗alert = Alert(driver)print(alert.text)  # 获取弹窗文本alert.accept()  # 点击"确定"按钮关闭弹窗# 关闭欣赏器driver.quit()
复制代码
4.15.2.2 切换窗口和标签页

  1. from selenium import webdriver
  2. driver = webdriver.Chrome()# 打开第一个窗口driver.get("https://example.com")# 打开第二个窗口driver.execute_script("window.open('https://example.org');")# 获取全部窗口句柄window_handles = driver.window_handles# 切换到第二个窗口driver.switch_to.window(window_handles[1])print(driver.title)
  3.   # 在第二个窗口中操纵# 切换回第一个窗口driver.switch_to.window(window_handles[0])# 关闭欣赏器driver.quit()
复制代码
4.15.2.3 操纵 Cookies

  1. from selenium import webdriver
  2. driver = webdriver.Chrome()# 打开网页driver.get("https://example.com")# 添加 Cookiedriver.add_cookie({"name": "test", "value": "123"})# 获取全部 Cookiescookies = driver.get_cookies()print(cookies)# 删除 Cookiedriver.delete_cookie("test")# 关闭欣赏器driver.quit()
复制代码
4.15.2.4 执行 JavaScript

  1. from selenium import webdriver
  2. driver = webdriver.Chrome()# 打开网页driver.get("https://example.com")# 执行 JavaScript 代码并获取返回值result = driver.execute_script("return document.title;")print(result)# 关闭欣赏器driver.quit()
复制代码
4.16 无头欣赏器模式

无头欣赏器模式允许你在没有图形用户界面(GUI)的情况下运行欣赏器。这对于在服务器情况中执行自动化测试、持续集成(CI)管道中使用Selenium非常有效,因为它不必要显示输出,可以节省资源并提高性能。以下是如何设置差别欣赏器以无头模式运行的方法。
4.16.1 设置Chrome为无头模式

对于Chrome欣赏器,通过设置--headless选项来启用无头模式。
  1. from selenium import webdriver
  2. from selenium.webdriver.chrome.options import Options# 初始化Chrome选项chrome_options = Options()# 添加无头模式参数chrome_options.add_argument("--headless")# 如果必要,还可以添加其他常用参数chrome_options.add_argument("--disable-gpu")  # 适用于Windows体系的额外参数chrome_options.add_argument("window-size=1920,1080")  # 设置窗口巨细# 使用设置好的选项启动Chrome WebDriverdriver = webdriver.Chrome(options=chrome_options)# 打开网页driver.get('http://www.example.com')# 输出页面标题,验证是否准确加载print(driver.title)
  3. # 关闭WebDriverdriver.quit()
复制代码
4.16.2 设置Firefox为无头模式

同样地,也可以将Firefox设置为无头模式运行。
  1. from selenium import webdriver
  2. from selenium.webdriver.firefox.options import Options# 初始化Firefox选项firefox_options = Options()# 添加无头模式参数firefox_options.add_argument("--headless")# 启动Firefox WebDriverdriver = webdriver.Firefox(options=firefox_options)# 打开网页driver.get('http://www.example.com')# 输出页面标题,验证是否准确加载print(driver.title)
  3. # 关闭WebDriverdriver.quit()
复制代码
4.16.3 设置Edge为无头模式

对于新版基于Chromium的Microsoft Edge欣赏器,可以通过设置--headless选项来启用无头模式。必要留意的是,由于Edge也是基于Chromium内核,因此它的设置方式与Chrome非常相似。
  1. from selenium import webdriver
  2. from selenium.webdriver.edge.options import Options# 初始化Edge选项edge_options = Options()# 添加无头模式参数edge_options.add_argument("--headless")# 如果必要,还可以添加其他常用参数edge_options.add_argument("--disable-gpu")  # 适用于某些体系的额外参数edge_options.add_argument("window-size=1920,1080")  # 设置窗口巨细# 使用设置好的选项启动Edge WebDriverdriver = webdriver.Edge(options=edge_options)# 打开网页driver.get('http://www.example.com')# 输出页面标题,验证是否准确加载print(driver.title)
  3. # 关闭WebDriverdriver.quit()
复制代码
留意事项



  • 体系兼容性: --disable-gpu 参数偶尔在Windows体系上是必需的,以避免潜在的问题。根据你的实际运行情况决定是否添加此参数。
  • 窗口巨细: 在无头模式下,默认窗口尺寸可能较小,这可能影响到一些依赖于特定屏幕分辨率或元素结构的测试案例。因此,建议明确设置一个符合的窗口巨细。
  • 性能优化: 启用无头模式可以显著提高执行效率,特别是在CI/CD情况中,因为它减少了资源消耗并加速了测试速率。
示例代码

  1. from selenium import webdriver
  2. from selenium.webdriver.common.by import By# 初始化Edge WebDriver实例driver = webdriver.Edge()
  3. # 打开指定的网页(这里以百度为例)driver.get('https://www.baidu.com/')# 查找名称为'wd'的输入框元素(百度搜索框)input_box = driver.find_element(By.NAME, 'wd')# 在找到的输入框中输入文本 "风景图片"input_box.send_keys('风景图片')# 查找ID为'su'的元素(百度搜索按钮),并点击该按钮进行搜索element = driver.find_element(By.ID, "su")
  4. element.click()
  5. # 清除输入框中的内容。留意:这行代码在实际场景中可能不必要,# 因为在点击搜索后通常不再必要操纵输入框。input_box.clear()
  6. # 获取之前点击的元素(搜索按钮)的value属性值,并打印出来。# 留意:通常搜索按钮的value属性不会包罗有效的信息,此步骤可能是为了演示如何获取属性值。value = element.get_attribute('value')
  7. print(value)# 查找CSS选择器匹配的设置链接元素,并获取其文本内容setting = driver.find_element(By.CSS_SELECTOR, '#u > a.pf')
  8. setting_text = setting.text
  9. print(setting_text)# 关闭当前窗口driver.close()
  10. # 退出欣赏器并竣事WebDriver会话。driver.quit()
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

美丽的神话

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表