Selenium
一.快速入门
Selenium是一个开源的Web自动化工具,一般用于测试、爬虫、刷票等场景。
三个组件:
Selenium IDE:浏览器插件,生成测试脚本(脚本录制),2021年已经停止更新
Selenium WebDriver:让代码控制浏览器模拟用户操作,自动化测试必备组件(最重要)
Selenium Grid:分布式扩展,让自动化脚本在多个机器上运行
特点:
行业标准:WebDriver成为了W3C(World Wide Web Consortium——万维网联盟)标准
兼容性强:
支持多语言:python、java、C#、ruby
支持多浏览器:chrome、Firefox、edge、safari
支持多环境:Windows、macos、Linux
生态比较成熟:
书籍、视频
Appium(App自动化测试):它对外提供的 API 与 Selenium WebDriver 几乎完全一致。如果你会 Selenium,就能非常快速地上手 Appium
pytest:Selenium 本身只是一个“库”,它负责浏览器操作。Selenium 可以与你所能想到的所有主流测试框架完美融合,而 pytest 是 Python 语言中最流行、最强大的代表。
二.Selenium环境搭建
在有python环境的前提下,在终端中
pip install selenium
运行测试代码,测试是否安装成功
from selenium import webdriver # 导入Selenium的WebDriver模块
driver = webdriver.Chrome() # 启动Chrome浏览器
driver.get("https://www.bing.com/") # 控制浏览器访问必应网站
driver.quit() # 关闭浏览器
运行结果:
不报错:安装成功
报错:
找不到浏览器Chrome:电脑上没有该浏览器或者安装的浏览器不是来自官网
找不到浏览器驱动ChromeDriver:一般情况下,在找到浏览器后会自动安装ChromeDriver驱动。出现此错误多半是网络问题, 可以手动去安装驱动,或者更换浏览器。
三.Selenium应用示例
能做什么(常见):
一般操作:访问、点击、输入
上下滚动
左右切换
大小缩放(兼容性问题)
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import timedef selenium_example():# 1 初始化 Edge WebDriverprint("初始化 Edge 浏览器...")options = webdriver.EdgeOptions()options.add_argument('--disable-blink-features=AutomationControlled')options.add_experimental_option("excludeSwitches", ["enable-automation"])options.add_experimental_option('useAutomationExtension', False)driver = webdriver.Edge(options=options)try:# 设置窗口大小driver.set_window_size(1200, 800)print("浏览器窗口已设置")# 2 访问示例网站(避免百度复杂的反爬机制)print("访问示例网站...")driver.get("https://www.selenium.dev")# 等待页面加载wait = WebDriverWait(driver, 10)wait.until(EC.presence_of_element_located((By.TAG_NAME, "body")))print("页面加载完成")# 3 点击操作 - 点击导航菜单print("尝试点击导航菜单...")try:# 尝试点击文档链接docs_link = wait.until(EC.element_to_be_clickable((By.LINK_TEXT, "Documentation")))docs_link.click()print("成功点击文档链接")time.sleep(2)except Exception as e:print(f"点击文档链接失败: {e}")# 如果点击失败,继续执行其他操作# 4 输入文本 - 在支持输入的页面上操作print("访问有输入框的示例页面...")driver.get("https://www.selenium.dev/selenium/web/web-form.html")# 等待输入框加载text_input = wait.until(EC.element_to_be_clickable((By.NAME, "my-text")))print("输入框已就绪")# 使用JavaScript设置值,避免交互问题driver.execute_script("arguments[0].value = 'Selenium测试文本';", text_input)print("文本输入完成")time.sleep(1)# 5 上下滚动print("执行页面滚动操作...")# 滚动到页面底部driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")print("滚动到底部")time.sleep(1)# 滚动到页面顶部driver.execute_script("window.scrollTo(0, 0);")print("滚动到顶部")time.sleep(1)# 滚动到中间位置driver.execute_script("window.scrollTo(0, 300);")print("滚动到中间")time.sleep(1)# 6 点击提交按钮(使用JavaScript避免交互问题)print("点击提交按钮...")submit_button = driver.find_element(By.CSS_SELECTOR, "button")driver.execute_script("arguments[0].click();", submit_button)print("提交按钮点击完成")time.sleep(2)# 7 左右切换 - 访问不同页面模拟标签页切换print("访问不同页面演示导航...")driver.get("https://www.example.com")print("访问example.com")time.sleep(2)# 执行JavaScript在新标签页打开页面driver.execute_script("window.open('https://www.wikipedia.org', '_blank');")print("新标签页已打开")time.sleep(2)# 获取所有窗口句柄并切换windows = driver.window_handlesif len(windows) > 1:driver.switch_to.window(windows[1])print("切换到新标签页")time.sleep(2)# 在新标签页中操作search_input = wait.until(EC.presence_of_element_located((By.NAME, "search")))driver.execute_script("arguments[0].value = 'Python编程';", search_input)print("在新标签页中输入文本")time.sleep(2)# 切换回原始标签页driver.switch_to.window(windows[0])print("切换回原始标签页")time.sleep(2)# 8 大小缩放 - 使用键盘快捷键print("执行缩放操作...")# 确保页面有焦点body = driver.find_element(By.TAG_NAME, "body")body.click()time.sleep(1)# 使用ActionChains进行缩放actions = ActionChains(driver)actions.key_down(Keys.CONTROL).send_keys(Keys.ADD).key_up(Keys.CONTROL).perform()print("页面放大")time.sleep(1)actions.key_down(Keys.CONTROL).send_keys(Keys.SUBTRACT).key_up(Keys.CONTROL).perform()print("页面缩小")time.sleep(1)# 重置缩放actions.key_down(Keys.CONTROL).send_keys('0').key_up(Keys.CONTROL).perform()print("重置缩放")time.sleep(1)# 9 演示更多滚动操作print("演示更多滚动操作...")driver.get("https://www.selenium.dev/documentation/")# 缓慢滚动演示for i in range(0, 1000, 100):driver.execute_script(f"window.scrollTo(0, {i});")time.sleep(0.2)print("所有操作成功完成!")except Exception as e:print(f"执行过程中出现错误: {e}")# 打印更详细的错误信息import tracebacktraceback.print_exc()finally:# 等待一会儿然后关闭浏览器time.sleep(3)driver.quit()print("Edge 浏览器已关闭")if __name__ == "__main__":print("使用 Edge 浏览器运行 Selenium 示例 ---")selenium_example()
四.两大对象
对象:面向对象
Selenium最开始使用Java开发,几乎所有的用法都是面向对象的风格。
两大对象
WebDriver:浏览器操作,浏览器的驱动对象,用来和浏览器交互。
打开网页
页面跳转
大小调整
截图
滚动窗口
切换窗口
获取网页标题、内容、网址
WebElement:元素的操作,通过 WebDriver 找到的 页面元素对象。
输入
点击
截图
获取内容、大小、位置
五.八种定位
class By: ID = "id" # 通过元素的id属性定位XPATH = "xpath" # 通过元素的XPath路径表达式来定位LINK_TEXT = "link text" # 通过超链接文本(a标签里的文字)定位PARTIAL_LINK_TEXT = "partial link text" # 通过超链接文本的一部分定位NAME = "name" # 通过元素的name属性定位。TAG_NAME = "tag name" # 通过元素的HTML标签名来定位CLASS_NAME = "class name" # 通过元素的class属性定位CSS_SELECTOR = "css selector" # 通过CSS选择器语法定位
针对链接
LINK_TEXT
PARTIAL_LINK_TEXT
针对元素属性
ID
NAME
TAG_NAME
CLASS_NAME
万能方法(最常用)
XPATH
CSS_SELECTOR
同一个元素可以使用不同的方式进行定位。
六.三大等待
等待元素加载完成
强制等待:让程序固定暂停一段时间,不管元素是否加载完成。
# 在元素定位之前,强制等待 time.sleep(2)
隐式等待:设置一个全局的等待时间,在查找元素时,如果元素没有立即出现,会在设定时间内不断尝试查找,直到超时。
# 隐式等待 driver.implicitly_wait(10)
七.Selenium和pytest集成
Selenium集成pytest
pip install pytest-selenium
若文件名以test_开头则不用加文件名
pytest --driver chrome --html report.html
test_demo3.py
def test_web(selenium):selenium.get("https://www.baidu.com")assert 1==2
八.测试框架封装
POM 页面对象模型
POM:Page Object Model 页面对象模型。核心思想是将Web页面抽象成一个类(Class),将页面上的元素定位和元素操作封装在这个类的方法中。
使用对象:代表页面
使用对象中的属性:代表页面元素
使用对象中的方法:代表页面的操作
def test_login_ok(selenium):page = LoginPage(selenium) # 1.实例化POis_ok = page.login('beifan_1025','beifan_1205') # 2.调用po方法assert True is is_ok # 3.断言
KDT 关键字驱动测试
KDT 是一种自动化测试框架或方法论。它将测试逻辑(做什么)与实现细节(怎么做)彻底分离。测试用例由一系列“关键字”组成,这些关键字代表最基本的操作动作。
关键字:最小的、可复用的操作单元。例如
Open Browser
,Input Text
,Click Button
,Verify Text
。测试数据:与关键字配合使用的数据。例如,对于
Input Text
这个关键字,需要提供 定位器 和 要输入的文本 这两组数据。驱动/引擎:这是框架的核心。它是一个解释器,负责读取关键字和测试数据,并调用对应的代码函数来执行它们。
测试脚本:通常以表格形式(如Excel, CSV)或特定DSL(领域特定语言)存在,它按顺序列出要执行的关键字和所需数据。