Selenium在Pyhton应用
目录
1. selenium的基本原理
2. selenium环境的搭建步骤
3. 元素的定位和操作
4.元素的基本属性方法
5.浏览器的操作方法
6.三种等待
强制等待
显示等待
隐式等待
7. 键盘与鼠标的操作
鼠标悬停用
拖拽操作
8. 下拉框元素定位
9.页面滚动操作
10. 页面截图操作
Selenium是一个用于Web应用程序测试的工具,它提供了一套完整的工具来编写自动化Web应用程序的测试。Selenium测试脚本,并且可以模拟用户与浏览器的交互
1. selenium的基本原理
-
WebDriver:
-
WebDriver是Selenium的核心组件,它是一个接口,用于编写客户端程序来控制浏览器。
-
WebDriver可以启动浏览器实例,发送命令给浏览器,接收浏览器的响应。
-
WebDriver支持多种浏览器,包括Chrome、Firefox、Internet Explorer、Safari等。
-
-
定位元素:
-
通过各种策略(如id、name、class name、css selector、xpath等)定位页面上的元素。
-
可以对定位单个元素或元素集合进行操作。
-
-
操作:
-
可以模拟用户操作,如点击、输入文本、拖拽等。
-
可以获取和设置元素的属性和值。
-
-
等待:
-
隐式等待(Implicit Wait):WebDriver会在执行命令时自动等待元素可操作。
-
显式等待(Explicit Wait):通过编写代码显式等待特定条件成立。
-
-
测试脚本:
-
用支持数据驱动测试,从外部文件或数据库读取测试数据。
-
支持并发执行测试,可以同时运行多个测试脚本。
-
-
结果验证:
-
可以验证页面元素的状态,检查是否符合预期。
-
支持断言(Assertions),验证测试结果是否符合预期。
-
2. selenium环境的搭建步骤
环境安装 pip install selenium
浏览器选择:支持多种浏览器
匹配规则:驱动版本与浏览器版本前三位必须一致,版本不匹配将导致代码无法运行
各版本驱动下载: chromedriver浏览器驱动各版本下载(...113、114、115、116、117、118、119、120、121、122、123、124、125、126、127、128、129、130、131、132、133、134、135、136、137、138、139、140)(原创) - Z哎呀 - 博客园
将下载驱动导入代码包中
import timefrom selenium import webdriverdriver = webdriver.Chrome()driver.get("https://www.baidu.com/")#页面最大化
driver.maximize_window()time.sleep(3)
#关闭驱动对象
driver.quit()
3. 元素的定位和操作
- ID定位:通过元素的id属性(最常用)
- name定位:通过元素的name属性
- class定位:通过元素的class属性(注意class可能有多个值)
- 标签定位:通过标签名(不推荐,难以保证唯一性)
- link_text:精准匹配超链接文本
- partial_link_text:模糊匹配超链接文本
- CSS选择器:通过CSS表达式定位
- XPath:通过XML路径表达式定位
import timefrom selenium import webdriver
from selenium.webdriver.common.by import Bydriver = webdriver.Chrome()driver.get("https://www.baidu.com/")#页面最大化
driver.maximize_window()#driver.find_element(By.ID,"kw").send_keys("李")#定位标签超链接的方式
#driver.find_element(By.LINK_TEXT,"新闻").click()
#模糊定位
#driver.find_element(By.PARTIAL_LINK_TEXT,"新").click()#Xpath定位
driver.find_element(By.XPATH,'//*[@id="kw"]').send_keys("cxk")time.sleep(3)
#关闭驱动对象
driver.quit()
4.元素的基本属性方法
5.浏览器的操作方法
#设置浏览器的分辨率(宽高)
driver.set_window_size(600,600)
#设置浏览器的相对位置
driver.set_window_position(100,600)
#浏览器的刷新
driver.refresh()
#浏览器的前进
driver.forward()
#浏览器的回退
driver.back()
#关闭浏览器的整个页面
driver.quit()
#关闭浏览器的当前页面
driver.close()
#页面标题
print(driver.title)
#页面当前网址
print(driver.current_url)
6.三种等待
强制等待
显示等待
导入模块
-
导入 WebDriverWait 类:
-
WebDriverWait
类用于显式等待(Explicit Wait),它允许你指定一个条件,当该条件满足时继续执行脚本。这有助于处理页面加载或元素出现时的延迟问题。
-
-
导入 expected_conditions 模块:
-
expected_conditions
模块包含一组预定义的条件,这些条件用于与 WebDriverWait 一起使用。这些条件定义了各种等待条件,如元素是否可见、是否可点击等。
-
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
在设定时间内,不间断的时间点去定位元素
一旦元素被加载出来,就会被定位到元素,然后执行操作
如果在有效时间内没有定位到元素,那么程序会报错: 超时错误TimeoutException
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ECdriver = webdriver.Chrome()driver.get("https://www.baidu.com/")#页面最大化
driver.maximize_window()#Xpath定位
driver.find_element(By.XPATH,'//*[@id="kw"]').send_keys("cxk")
driver.find_element(By.XPATH,'//*[@id="su"]').click()el1 = WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.XPATH, '//*[@id="s_tab_inner"]/a[2]/span')))
el1.click()time.sleep(3)
#关闭驱动对象
driver.quit()
隐式等待
driver.implicitly_wait(3)
driver.find_element(By.XPATH,'//*[@id="s_tab_inner"]/a[2]/span')
元素第一次被定位的时候如果能够定位到,那么不会触发隐式等待,如果定位不到才会触发隐式等待的有效时间
可是设置隐式等待的有效时长,如果在有效时长里定位元素,那么不会报错,反之会报错提示,没有找到钙元素的异常: NoSuchElementException
7. 键盘与鼠标的操作
需要从webdriver包中导入Keys类
from selenium.webdriver.common.keys import Keys
输入"美女"文本:element1.send_keys("美女")
全选内容:element1.send_keys(Keys.CONTROL + 'a')
复制内容:element1.send_keys(Keys.CONTROL + 'c')
删除内容:element1.send_keys(Keys.BACKSPACE)
输入"帅哥"文本:element1.send_keys("帅哥")
再次全选:element1.send_keys(Keys.CONTROL + 'a')
粘贴内容:element1.send_keys(Keys.CONTROL + 'v')
清空内容:element1.clear()
常用鼠标操作方法
从selenium.webdriver导入ActionChains类,该类提供多种鼠标操作方法
- 右击操作:使用context_click()方法,传入目标元素参数
- 双击操作:使用double_click()方法,传入目标元素参
鼠标悬停用
element = driver.find_element_by_id("element_id") # 定位元素
ActionChains(driver).move_to_element(element).perform() # 鼠标悬用到元素上
拖拽操作
从selenium.webdriver导入ActionChains类,该类提供多种鼠标操作方法
source = driver.find_element_by_id("source_id") # 源元素
target = driver.find_element_by_id("target_id") # 目标元素
ActionChains(driver).drag_and_drop(source, target).perform() # 从源元素拖拽到目标元素
8. 下拉框元素定位
- 首先需要创建Select类对象
- 通过webdriver.support.select导入Select类
- 传递要定位的下拉框元素对象(可通过xpath获取)
- 索引定位:select_by_index(),下标从0开始
- 文本定位:select_by_visible_text(),通过选项显示文本
- 值定位:select_by_value(),通过选项的value属性值
9.页面滚动操作
通过JavaScript脚本执行滚动操作
- 第一个参数控制左右滚动
- 第二个参数控制上下滚动
- 执行方法:driver.execute_script(js脚本)
10. 页面截图操作
方法:driver.get_screenshot_as_file()
仅支持PNG格式
11. 警告框
获取警告框元素
通过find_element和XPath定位警告框触发元素,对定位到的元素执行click()操作
- 使用switch_to.alert切入警告框
- 获取文本:通过alert对象的text属性获取提示信息
关闭警告框的方法
使用accept()方法模拟点击确定按钮
使用dismiss()方法模拟点击取消按钮
即使警告框界面上没有显示取消按钮,调用dismiss()方法仍可取消
输入型警告框处理
对于需要输入内容的警告框,使用send_keys()方法