1.环境配置
windows环境配置
1.下载chromedriver,与本机chrome浏览器版本一致,本机chrome版本在浏览器关于chrome里查看,下载地址为淘宝镜像:CNPM Binaries Mirror
浏览器webdriver最新版本到这里下载:CNPM Binaries Mirror
2.下载完成后解压并配置环境变量,在系统环境变量 path中添加chromedriver的路径:
3.在cmd中验证配置是否成功:输入chormedriver或chromedriver -version 能显示版本信息即为成功配置了环境变量
4.重启IDE才能使用
mac环境配置:
- 进入命令行工具,确定当前的SHELL环境:echo $SHELL
- 根据自己的SHELL环境选择执行命令:
- 如果显示/bin/bash,则vim ~/.bash_profile
- 如果显示/bin/zsh则vim ~/.zshrc
- 在文件中添加:export PATH=$PATH:[chromedriver所在路径]
- 重启命令行工具,重启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")
))