• selenium网页自动化使用教程


    Selenium 是一个流行的自动化测试工具,它支持多种编程语言,包括 Python。以下是关于 Selenium 安装和使用的一些详细步骤:

    安装 Selenium:

    • 确保 Python 环境已经安装在你的计算机上。Selenium 支持 Python 2.7 以及 Python 3.2 至 3.4 版本。
    • 使用 pip 来安装 Selenium。打开命令行工具,输入以下命令:
      pip install selenium
      
    • 如果你使用的是 Python 3.4 或更高版本,那么 pip 已经包含在标准库中。
    1. 安装浏览器驱动

      • Selenium 需要特定浏览器的驱动程序来与浏览器进行交互。例如,对于 Chrome 浏览器,你需要下载 ChromeDriver。
      • 下载与你的浏览器版本相匹配的驱动程序,并确保它在系统的 PATH 环境变量中,或者在代码中指定其路径。
    2. 编写测试脚本

      • 创建一个 Python 脚本文件,例如 my_selenium_script.py
      • 在脚本中,你可以使用 Selenium 的 API 来编写自动化测试代码。例如,启动浏览器、导航到网页、查找元素等。
    3. 运行测试脚本

      • 在命令行中,使用 Python 来运行你的测试脚本:
        python my_selenium_script.py
        
    4. 使用 Selenium Server

      • 如果你需要使用 Remote WebDriver,那么你需要安装 Selenium Server,这是一个 Java 程序。
      • 从 Selenium 官网下载 Selenium Server 的 JAR 文件,并使用 Java 运行它:
        java -jar selenium-server-standalone-2.x.x.jar
        
    5. 解决安装问题

      • 如果在安装过程中遇到超时问题,可以尝试使用国内镜像源来加速下载,例如使用豆瓣的源:
        pip install -U selenium -i https://pypi.douban.com/simple
        ```。
        
        
    6. 测试 Selenium 是否安装成功

      • 编写一个简单的测试脚本来检查 Selenium 是否能够正常控制浏览器。例如,使用 Edge 浏览器打开一个网页并检查是否成功弹出。

    确保你已经根据你的操作系统和 Python 版本下载了正确版本的 Selenium 和浏览器驱动程序。通过上述步骤,你应该能够成功安装并开始使用 Selenium 进行自动化测试。

    一、元素操作方法

    在 Selenium 中,元素操作方法是进行自动化测试和网页交互的基础。以下是一些常用的元素操作方法:

    1. 定位元素

      • 使用 find_element_by_id, find_element_by_name, find_element_by_xpath, find_element_by_css_selector 等方法来定位页面上的元素。
    2. 点击元素

      • 使用 click() 方法来模拟鼠标点击操作。
    3. 输入文本

      • 使用 send_keys()clear() 后跟 send_keys() 来在输入框中输入文本。
    4. 获取元素属性

      • 使用 get_attribute('attribute_name') 方法来获取元素的特定属性值。
    5. 获取元素文本

      • 直接使用 text 属性来获取元素的文本内容。
    6. 提交表单

      • 对于表单提交按钮,使用 click() 方法可以提交表单。
    7. 检查元素是否可见

      • 使用 is_displayed() 方法来检查元素是否在页面上可见。
    8. 检查元素是否被选中

      • 使用 is_selected() 方法来检查复选框或单选按钮是否被选中。
    9. 切换元素(如 iframe)

      • 使用 switch_to.frame() 方法来切换到 iframe 中进行操作。
    10. 等待元素加载

      • 使用 WebDriverWaitexpected_conditions 来等待元素加载完成,例如 visibility_of_element_located
    11. 获取元素的尺寸和位置

      • 使用 sizelocation 属性来获取元素的尺寸和在页面上的位置。
    12. 滚动到元素

      • 使用 execute_script("arguments[0].scrollIntoView();", element) 来滚动到页面上的特定元素。
    13. 执行 JavaScript

      • 使用 execute_script() 方法来执行 JavaScript 代码,可以对元素进行更复杂的操作。
    14. 拖放操作

      • 使用 ActionChains 类来执行拖放操作。
    15. 获取元素的标签名

      • 使用 tag_name 属性来获取元素的标签名。

    当然,以下是一些 Selenium 元素操作方法的 Python 代码示例:

    from selenium import webdriver
    from selenium.webdriver.common.keys import Keys
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    # 初始化 WebDriver,以 Chrome 浏览器为例
    driver = webdriver.Chrome()
    
    # 打开网页
    driver.get("http://www.example.com")
    
    # 定位元素
    # 假设我们要定位一个id为"myInput"的输入框
    input_element = driver.find_element(By.ID, "myInput")
    
    # 输入文本
    input_element.send_keys("Hello, Selenium!")
    
    # 定位一个按钮并点击
    submit_button = driver.find_element(By.XPATH, "//button[@type='submit']")
    submit_button.click()
    
    # 获取元素属性
    href_value = driver.find_element(By.CSS_SELECTOR, "a").get_attribute("href")
    
    # 获取元素文本
    text_element = driver.find_element(By.ID, "textElement")
    element_text = text_element.text
    
    # 检查元素是否可见
    is_visible = text_element.is_displayed()
    
    # 检查复选框是否被选中
    checkbox = driver.find_element(By.ID, "myCheckbox")
    is_selected = checkbox.is_selected()
    
    # 切换到 iframe
    iframe = driver.find_element(By.ID, "myIframe")
    driver.switch_to.frame(iframe)
    
    # 等待元素加载
    wait = WebDriverWait(driver, 10)
    try:
        element = wait.until(EC.visibility_of_element_located((By.ID, "myElement")))
    finally:
        element.click()
    
    # 滚动到元素
    element = driver.find_element(By.ID, "bottomElement")
    driver.execute_script("arguments[0].scrollIntoView();", element)
    
    # 执行 JavaScript
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    
    # 拖放操作
    from selenium.webdriver import ActionChains
    source = driver.find_element(By.ID, "sourceElement")
    target = driver.find_element(By.ID, "targetElement")
    action = ActionChains(driver)
    action.drag_and_drop(source, target).perform()
    
    # 获取元素的尺寸和位置
    size = element.size
    location = element.location
    
    # 获取元素的标签名
    tag_name = element.tag_name
    
    # 关闭浏览器
    driver.quit()
    

    请注意,这些代码示例需要根据你实际要操作的网页元素进行相应的调整。例如,你需要替换 "http://www.example.com" 为你想要访问的网址,以及使用正确的元素定位方法和属性。此外,确保你已经安装了 Selenium 库和相应的 WebDriver。

    二、浏览器操作方法

    在 Selenium 中,除了对元素进行操作外,还有一些浏览器操作方法,可以控制浏览器的行为。以下是一些常见的浏览器操作方法及其 Python 代码示例:

    1. 打开和关闭浏览器
      • 使用 get() 方法打开一个特定的 URL。
      • 使用 close() 方法关闭当前浏览器窗口。
      • 使用 quit() 方法关闭浏览器会话并结束 WebDriver。
    # 打开浏览器并访问网页
    driver.get("http://www.example.com")
    
    # 关闭当前浏览器窗口
    driver.close()
    
    # 关闭浏览器会话
    driver.quit()
    
    1. 最大化浏览器窗口
      • 使用 maximize_window() 方法来最大化浏览器窗口。
    driver.maximize_window()
    
    1. 设置浏览器窗口大小
      • 使用 set_window_size(width, height) 方法来设置浏览器窗口的大小。
    driver.set_window_size(800, 600)
    
    1. 前进和后退
      • 使用 forward() 方法来前进到历史记录中的下一个页面。
      • 使用 back() 方法来后退到历史记录中的上一个页面。
    # 前进
    driver.forward()
    
    # 后退
    driver.back()
    
    1. 刷新页面
      • 使用 refresh() 方法来刷新当前页面。
    driver.refresh()
    
    1. 获取当前 URL
      • 使用 current_url 属性来获取当前页面的 URL。
    current_url = driver.current_url
    print("Current URL:", current_url)
    
    1. 获取页面标题
      • 使用 title 属性来获取当前页面的标题。
    page_title = driver.title
    print("Page Title:", page_title)
    
    1. 获取页面源代码
      • 使用 page_source 属性来获取当前页面的 HTML 源代码。
    page_source = driver.page_source
    print("Page Source:", page_source)
    
    1. 执行 JavaScript
      • 使用 execute_script() 方法来执行 JavaScript 代码。
    result = driver.execute_script("return document.title;")
    print("JavaScript Execution Result:", result)
    
    1. 切换浏览器窗口或标签页
      • 使用 switch_to.window(window_name) 方法来切换到不同的浏览器窗口或标签页。
    # 切换到新的窗口或标签页
    driver.switch_to.window("new_window_name")
    
    1. 切换到 iframe
      • 使用 switch_to.frame() 方法来切换到 iframe。
    # 切换到 iframe
    driver.switch_to.frame("iframe_id")
    
    1. 切换到默认内容
      • 使用 switch_to.default_content() 方法来从 iframe 切换回主文档。
    driver.switch_to.default_content()
    
    1. 获取所有窗口或标签页的句柄
      • 使用 window_handles 属性来获取当前浏览器会话中所有窗口或标签页的句柄列表。
    window_handles = driver.window_handles
    print("Window Handles:", window_handles)
    
    1. 获取当前窗口或标签页的句柄
      • 使用 current_window_handle 属性来获取当前活动窗口或标签页的句柄。
    current_window_handle = driver.current_window_handle
    print("Current Window Handle:", current_window_handle)
    

    这些浏览器操作方法可以帮助你控制浏览器的行为,以适应不同的测试场景。记得在编写测试脚本时,根据实际需求选择合适的方法。

    三、获取元素信息操作

    在 Selenium 中,获取元素信息是进行自动化测试和数据提取的重要部分。以下是一些常用的获取元素信息的方法及其 Python 代码示例:

    1. 获取元素的文本内容
      • 使用 text 属性获取元素内的文本。
    element_text = driver.find_element(By.ID, "elementId").text
    
    1. 获取元素的属性值
      • 使用 get_attribute('attribute_name') 方法获取元素的特定属性值。
    element_attribute = driver.find_element(By.ID, "elementId").get_attribute("data-attribute")
    
    1. 判断元素是否可见
      • 使用 is_displayed() 方法判断元素是否在页面上可见。
    is_element_visible = driver.find_element(By.ID, "elementId").is_displayed()
    
    1. 判断元素是否被选中
      • 对于复选框或单选按钮,使用 is_selected() 方法判断元素是否被选中。
    is_element_selected = driver.find_element(By.ID, "checkboxId").is_selected()
    
    1. 获取元素的标签名
      • 使用 tag_name 属性获取元素的 HTML 标签名。
    element_tag = driver.find_element(By.ID, "elementId").tag_name
    
    1. 获取元素的尺寸和位置
      • 使用 sizelocation 属性获取元素的大小和在页面上的位置。
    element_size = driver.find_element(By.ID, "elementId").size
    element_location = driver.find_element(By.ID, "elementId").location
    
    1. 获取元素的 CSS 值
      • 使用 value_of_css_property('css_property_name') 方法获取元素的 CSS 属性值。
    element_css_value = driver.find_element(By.ID, "elementId").value_of_css_property("background-color")
    
    1. 获取元素内的所有文本
      • 对于包含多个子元素的容器,可以使用 text 属性获取所有文本。
    container_text = driver.find_element(By.ID, "containerId").text
    
    1. 获取元素的子元素
      • 使用 find_elements(By.CHILD_SELECTOR) 方法获取元素的所有子元素。
    child_elements = driver.find_element(By.ID, "parentId").find_elements(By.TAG_NAME, "li")
    
    1. 获取元素的父元素
      • 使用 find_element(By.XPATH, '..') 方法获取元素的直接父元素。
    parent_element = driver.find_element(By.ID, "childId").find_element(By.XPATH, "..")
    
    1. 获取元素的兄弟元素
      • 使用 XPath 或其他定位方法获取元素的前一个或后一个兄弟元素。
    previous_sibling = driver.find_element(By.ID, "elementId").find_element(By.XPATH, "preceding-sibling::*")
    next_sibling = driver.find_element(By.ID, "elementId").find_element(By.XPATH, "following-sibling::*")
    
    1. 获取页面源代码中的元素
      • 使用 page_source 属性获取当前页面的 HTML 源代码,然后解析出特定元素的信息。
    page_source = driver.page_source
    # 假设使用 BeautifulSoup 或其他库解析 HTML 并提取元素信息
    

    这些方法可以帮助你获取页面元素的各种信息,从而进行进一步的处理或断言。在实际使用中,你可能需要根据元素的具体情况和测试需求来选择合适的方法。

    四、鼠标操作 (需要实例化鼠标对象)

    在 Selenium 中执行鼠标相关的操作,可以通过 ActionChains 类来实现。这个类允许你创建一系列鼠标事件,比如移动到元素、点击、长按、双击、右键点击等。以下是一些使用 ActionChains 进行鼠标操作的 Python 代码示例:

    1. 实例化 ActionChains 对象
      • 首先,你需要从 selenium.webdriver 模块中导入 ActionChains 并实例化。
    from selenium import webdriver
    from selenium.webdriver import ActionChains
    
    driver = webdriver.Chrome()
    driver.get("http://www.example.com")
    action = ActionChains(driver)
    
    1. 移动到元素
      • 使用 move_to_element(element) 方法将鼠标指针移动到指定的元素上。
    element = driver.find_element(By.ID, "elementId")
    action.move_to_element(element)
    
    1. 点击元素
      • 使用 click(element) 方法模拟鼠标点击操作。
    action.click(element)
    
    1. 长按元素
      • 使用 context_click(element) 进行鼠标右键点击,或者 double_click(element) 进行双击操作。
    action.context_click(element)  # 右键点击
    action.double_click(element)  # 双击
    
    1. 拖放操作
      • 使用 drag_and_drop(source, target) 将一个元素拖放到另一个元素上。
    source_element = driver.find_element(By.ID, "sourceElementId")
    target_element = driver.find_element(By.ID, "targetElementId")
    action.drag_and_drop(source_element, target_element)
    
    1. 鼠标悬停
      • 使用 move_by_offset(xoffset, yoffset) 将鼠标指针移动到相对于当前位置的偏移位置。
    action.move_by_offset(200, 100)  # 向右移动200像素,向下移动100像素
    
    1. 滚动鼠标滚轮
      • 使用 scroll_by_amount(value) 滚动鼠标滚轮,value 可以是正数或负数。
    action.scroll_by_amount(100)  # 向下滚动100像素
    
    1. 释放鼠标按钮
      • 使用 release() 方法释放鼠标按钮。
    action.click_and_hold(element)  # 长按
    action.move_to_element(other_element)  # 移动到另一个元素
    action.release()  # 释放鼠标按钮
    
    1. 执行动作序列
      • 使用 perform() 方法执行所有创建的动作序列。
    action.perform()
    
    1. 鼠标退出
      • 有时在执行完鼠标操作后,需要将鼠标移动到浏览器窗口外,可以使用 ActionChains.context_click() 后跟 perform() 实现。
    # 移动到页面的一个角落
    bottom_right = driver.execute_script("return document.body.getBoundingClientRect()")
    action.move_by_offset(bottom_right['right'] - 100, bottom_right['bottom'] - 100)
    action.context_click()
    action.perform()
    

    请注意,ActionChains 的每个方法调用后,都不会立即执行,而是存储为一个待执行的动作。只有调用 perform() 方法后,这些动作才会按照创建的顺序被执行。这允许你创建复杂的鼠标操作序列,然后一次性执行它们。

    五、键盘操作(不需要实例化对象)

    在 Selenium 中进行键盘操作,通常不需要单独实例化对象,而是直接在 WebDriver 的实例上调用相关方法。以下是一些键盘操作的 Python 代码示例:

    1. 发送按键操作
      • 使用 send_keys() 方法向网页元素发送按键输入。
    element = driver.find_element(By.ID, "inputField")
    element.send_keys("Hello, World!")
    
    1. 模拟按键组合
      • 可以通过 send_keys() 方法发送组合键,例如 Ctrl+A、Ctrl+C、Ctrl+V。
    # 定位到一个文本输入区域
    text_area = driver.find_element(By.ID, "textAreaId")
    
    # 发送 Ctrl+A 选择所有文本
    text_area.send_keys(Keys.CONTROL, 'a')
    
    # 发送 Ctrl+C 复制文本
    text_area.send_keys(Keys.CONTROL, 'c')
    
    # 切换到另一个输入区域并粘贴 Ctrl+V
    another_input = driver.find_element(By.ID, "anotherInputId")
    another_input.send_keys(Keys.CONTROL, 'v')
    
    1. 特殊按键
      • 可以使用 Keys 类中的常量来模拟特殊按键,如箭头键、Enter 键、Esc 键等。
    # 定位到一个输入框并按 Enter 键
    input_box = driver.find_element(By.ID, "inputBoxId")
    input_box.send_keys(Keys.ENTER)
    
    # 按 Esc 键
    input_box.send_keys(Keys.ESCAPE)
    
    1. 清除输入框内容
      • 在发送新内容之前,可以使用 clear() 方法清空输入框。
    input_box = driver.find_element(By.ID, "inputBoxId")
    input_box.clear()
    input_box.send_keys("New content")
    
    1. 使用快捷键
      • 可以组合使用 Keys 中的常量来模拟快捷键操作。
    # 模拟 Alt+F4 关闭当前窗口
    driver.execute_script("window.close();")
    
    1. 模拟连续按键
      • 可以通过连续调用 send_keys() 方法发送多个按键。
    # 模拟连续按键操作
    input_box.send_keys("Hello")
    input_box.send_keys(Keys.ARROW_LEFT, Keys.ARROW_LEFT)  # 向左移动光标两次
    input_box.send_keys(", World!")
    
    1. 模拟按键延迟
      • 有时可能需要在按键之间添加延迟,可以使用 time.sleep(seconds) 来实现。
    import time
    
    input_box.send_keys("Hello")
    time.sleep(2)  # 等待2秒
    input_box.send_keys(Keys.ARROW_LEFT)
    
    1. 模拟按键释放
      • 在某些情况下,可能需要模拟按键的释放,这可以通过发送空格然后再次发送按键来实现。
    # 模拟按键按下并释放
    input_box.send_keys(Keys.SHIFT)
    input_box.send_keys("a")  # 模拟按下 Shift 并输入小写 a
    input_box.send_keys(" ")  # 释放 Shift 键
    

    请注意,Keys 类提供了许多用于模拟键盘操作的常量,例如 Keys.CONTROL, Keys.ALT, Keys.SHIFT 等,以及数字和字母的常量表示。在使用键盘操作时,确保元素是可接受键盘输入的,并且已经正确定位。

    六、元素等待

    在 Selenium 中,元素等待是一个重要的概念,用于确保元素在进行操作前已经加载完成并且可以交互。Selenium 提供了几种等待机制:

    1. 隐式等待(推荐使用显式等待):
      • 告诉 WebDriver 等待一段时间来加载页面上的元素。如果元素在指定时间内没有加载完成,将抛出 NoSuchElementException
    driver.implicitly_wait(10)  # 等待10秒
    element = driver.find_element(By.ID, "myElement")
    
    1. 显式等待
      • 使用 WebDriverWaitexpected_conditions 来创建一个等待条件,直到条件满足或超时。
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    # 设置显式等待,最长等待时间10秒
    wait = WebDriverWait(driver, 10)
    
    # 等待一个元素可被点击
    element = wait.until(EC.element_to_be_clickable((By.ID, "myButton")))
    
    # 执行点击操作
    element.click()
    
    1. 等待元素可见
      • 等待元素在页面上可见(可能被其他元素遮挡)。
    # 等待元素可见
    element = wait.until(EC.visibility_of_element_located((By.ID, "myElement")))
    
    1. 等待元素不可见
      • 等待元素在页面上不可见。
    # 等待元素不可见
    wait.until(EC.invisibility_of_element_located((By.ID, "myElement")))
    
    1. 等待元素存在
      • 等待元素存在于DOM中。
    # 等待元素存在
    wait.until(EC.presence_of_element_located((By.ID, "myElement")))
    
    1. 等待元素被选中
      • 等待元素被选中,如复选框或单选按钮。
    # 等待复选框被选中
    checkbox = wait.until(EC.element_to_be_selected((By.ID, "myCheckbox")))
    
    1. 等待元素未被选中
      • 等待元素未被选中。
    # 等待复选框未被选中
    checkbox = wait.until(EC.element_located_to_be_unselected((By.ID, "myCheckbox")))
    
    1. 等待元素数量
      • 等待页面上存在特定数量的元素。
    # 等待页面上至少有5个元素
    elements = wait.until(EC.number_of_elements_to_be(By.ID, "myElement"), 5)
    
    1. 自定义等待条件
      • 创建自定义的等待条件,例如等待某个JavaScript表达式的结果为真。
    # 等待某个JavaScript表达式的结果为真
    wait.until(lambda driver: driver.execute_script("return window.readyState") == "complete")
    

    显式等待比隐式等待更灵活,因为它允许你为不同的操作设置不同的等待条件和超时时间。显式等待也有助于编写更清晰和更易于理解的测试代码。使用显式等待时,你需要从 selenium.webdriver.support 模块导入 WebDriverWaitexpected_conditions

    七、下拉框(需要实例化下拉框)

    在 Selenium 中操作下拉框,可以使用 Select 类,它提供了一些方法来选择下拉框中的选项。以下是一些操作下拉框的 Python 代码示例:

    1. 实例化 Select 对象
      • 使用 Select 类来包装下拉框元素。
    from selenium.webdriver.support.ui import Select
    
    # 定位到下拉框元素
    select_element = driver.find_element(By.ID, "selectElementId")
    
    # 实例化 Select 对象
    select = Select(select_element)
    
    1. 选择下拉框中的选项
      • 使用 select_by_visible_text(text) 方法根据可见的文本选择选项。
    # 根据文本选择下拉框中的选项
    select.select_by_visible_text("Option 1")
    
    1. 通过索引选择下拉框中的选项
      • 使用 select_by_index(index) 方法根据选项的索引选择。
    # 根据索引选择下拉框中的选项
    select.select_by_index(1)
    
    1. 通过值选择下拉框中的选项
      • 使用 select_by_value(value) 方法根据选项的值选择。
    # 根据值选择下拉框中的选项
    select.select_by_value("option1")
    
    1. 获取下拉框中的所有选项
      • 使用 all_selected_options 属性获取所有被选中的选项。
    # 获取所有被选中的选项
    selected_options = select.all_selected_options
    for option in selected_options:
        print(option.text)
    
    1. 获取下拉框中的单个选项
      • 使用 first_selected_option 属性获取第一个被选中的选项。
    # 获取第一个被选中的选项
    first_option = select.first_selected_option
    print(first_option.text)
    
    1. 取消选择下拉框中的选项
      • 使用 deselect_all() 方法取消选择下拉框中的所有选项。
    # 取消选择下拉框中的所有选项
    select.deselect_all()
    
    1. 取消选择特定的下拉框选项
      • 使用 deselect_by_visible_text(text) 方法取消选择特定的选项。
    # 根据文本取消选择下拉框中的选项
    select.deselect_by_visible_text("Option 1")
    
    1. 检查下拉框选项是否被选中
      • 使用 is_multiple 属性判断下拉框是否允许多选。
    # 判断下拉框是否允许多选
    if select.is_multiple:
        print("This is a multiple select box.")
    
    1. 获取下拉框中的选项数量
      • 使用 options 属性获取下拉框中的所有选项,然后使用 len() 函数计算数量。
    # 获取下拉框中的选项数量
    option_count = len(select.options)
    print("Number of options:", option_count)
    

    请注意,在使用 Select 类之前,必须确保已经定位到下拉框元素,并且该元素是一个