Selenium WebUI自动化测试一:环境配置与等待方式

1.环境配置

windows环境配置

1.下载chromedriver,与本机chrome浏览器版本一致,本机chrome版本在浏览器关于chrome里查看,下载地址为淘宝镜像:CNPM Binaries Mirror

浏览器webdriver最新版本到这里下载:CNPM Binaries Mirror

2.下载完成后解压并配置环境变量,在系统环境变量 path中添加chromedriver的路径:
image

3.在cmd中验证配置是否成功:输入chormedriver或chromedriver -version 能显示版本信息即为成功配置了环境变量

4.重启IDE才能使用

mac环境配置:

  1. 进入命令行工具,确定当前的SHELL环境:echo $SHELL
  2. 根据自己的SHELL环境选择执行命令:
  • 如果显示/bin/bash,则vim ~/.bash_profile
  • 如果显示/bin/zsh则vim ~/.zshrc
  1. 在文件中添加:export PATH=$PATH:[chromedriver所在路径]
  2. 重启命令行工具,重启IDE

其他方式:selenium4.6以后可以自动下载与浏览器匹配的webdriver,浏览器会自动更新版本。如果配置了环境变量会优先去找环境变量配置的路径,版本不匹配会报错

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
cLass TestWeWork:
    def test_open(self):
    # 配置 driver 不需要配置环境变量
    service = Service(executable_path=ChromeDriverManager().install())
    driver = webdriver.Chrome(service=service)
    # 打开页面
    driver.get("https://work.weixin.qq.com/wework_admin/frame#index")
    sleep(3)

2.三种等待方式

类型 使用方式 原理 适用场景
直接等待 time.sleep(等待时间)) 强制线程等待 调试代码,临时性添加
隐式等待 driver.implicitly_wait(等待时间) 在时间范围内,轮询查找元素 解决找不到元素问题,无法解决交互问题
显式等待 WebDriverWait(driver实例, 最长等待时间, 轮询时间).until(结束条件) 设定特定的等待条件,轮询操作 解决特定条件下的等待问题,比如点击等交互性行为

显式等待示例;

from selenium.webdriver.common.by import By

from selenium.webdriver.support import expected_conditions

from selenium.webdriver.support.wait import WebDriverWait
def wait_until():
    driver = webdriver.Chrome()
    driver.get("https://vip.ceshiren.com/#/ui_study")
    WebDriverWait(driver, 10).until(
        expected_conditions.element_to_be_clickable(
            (By.CSS_SELECTOR, '#success_btn')))
    driver.find_element(By.CSS_SELECTOR, "#success_btn").click()

【自定义显示等待】excepted_conditions不可能覆盖所有场景,封装自定义的等待条件是非常有价值的,没有一种强制等待是不可以被显示等待替代的.

# 对local_ele进行点击,直到verify_ele出现,返回应是函数对象,而不是函数调用
def condition_search_for(self, local_ele, verify_ele):
    def condition(driver):
        driver.find_element(*local_ele).click()
        return driver.find_element(*verify_ele)
    return condition
# 调用处:until函数传入的是函数对象,而不是函数调用
    WebDriverWait(self.driver, 10).until(self.condition_search_for(
        (By.XPATH, "//*[@class='ww_operationBar']/*[text()='添加成员']"),
        (By.CLASS_NAME, "hr_tips.js_hr_tips")
    ))