文章目录
selenium(web自动化测试)
1. selenium初始化(2种)
- 方式一:
# 导入包 (selenium 4版本)import pytest, os
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
# 用 os 处理路径
chrome_driver_path = os.path.abspath(os.path.join(os.path.dirname(os.path.dirname(__file__)),'drivers/chromedriver.exe'))
edge_driver_path = os.path.abspath(os.path.join(os.path.dirname(os.path.dirname(__file__)),'drivers/msedgedriver.exe'))# 处理测试初始化@pytest.fixture(scope='session')defopen_close_browser():print("Open browser!")# 调起 chrome 浏览器
driver = webdriver.Chrome(service=Service(chrome_driver_path))# 调起 edge 浏览器# driver = webdriver.Edge(service=Service(edge_driver_path))yield driver
print("Close browser!")
driver.close()print("Test over!")
- 方式二:(推荐)
# 导入包 (selenium 4版本)import pytest, os
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from webdriver_manager.microsoft import EdgeChromiumDriverManager
from webdriver_manager.microsoft import IEDriverManager
from webdriver_manager.firefox import GeckoDriverManager
# 处理测试初始化print("Open browser!")# 调起 chrome 浏览器# 设置 option 参数(选择)
service = Service(executable_path=ChromeDriverManager().install())
driver = webdriver.Chrome(service=service)# 调起 edge 浏览器# service = Service(executable_path=EdgeChromiumDriverManager().install())# driver = webdriver.Edge(service=service)# 调起 ie 浏览器# service = Service(executable_path=IEDriverManager().install())# driver = webdriver.Ie(service=service)# 调起 firefox 浏览器# service = Service(executable_path=GeckoDriverManager().install())# driver = webdriver.Firefox(service=service)yield driver
print("Close browser!")
driver.close()print("Test over!")# 自动下载的 driver(驱动)在C盘的用户夹下的.wdn文件中。
2. chrome 启动参数(3种)
- –headless: 无界面运行(示例)
# 选择参数
option = webdriver.ChromeOptions()# 添加属性值
option.add_argument('--headless')# 创建浏览器驱动对象
driver = webdriver.Chrome(options=option, service=Service(chrome_driver_path))
- –start-maximized: 窗口最大化运行
option.add_argument('--start-maximized')
- –incognito: 隐身模式运行
option.add_argument('--incognito')
- 不展示“浏览器正在被自动化程序控制”提示
option.add_experimental_option('excludeSwitches',['enable-automation'])
3. 八大定位方式
定位方式代码id 定位driver.find_element(By.ID, ‘kw’)name 定位driver.find_element(By.NAME, ‘wd’)classname 定位driver.find_element(By.CLASS_NAME, ‘s_ipt’)tar_name 定位driver.find_element(By.TAG_NAME, ‘input’)css 定位1. driver.find_element(By.CSS_SELECTOR, ‘#kw’) # CSS选择器
2. driver.find_element(By.CSS_SELECTOR, ‘input.s_plt’) # CSS选择器xpath 定位driver.find_element(By.XPATH, ‘//*[@id=“kw”]’)link_text 定位driver.find_element(By.LINK_TEXT, ‘新闻’)partial_link_text 定位driver.find_element(By.PARTIAL_LINK_TEXT, ‘新’)
3.1 css 定位
工具获取
- 通过chrome开发者工具复制可得, 百度首页为例,css定位搜索输入框
driver.find_element(By.CSS_SELECTOR,'#kw').send_keys('selenium')
手工编写获取
- 标签和属性组合: 标签名[属性名=属性值]
- 有多个标签时,标签之前空格相隔
- 属性可以是任意属性
- class/id除了可以采用以上写法外,还可以采用专用写法, 以百度搜索输入框为例:
- 通过class编写: 标签名.class属性值
input.s_ipt # input标签中class属性值为s_ipt
- 通过id编写: 标签名#id属性值input#kw # input标签中id属性值为kw
- class 和 id 组合input#kw.s_ipt # input标签中id值为kw,class值为s_ipt
- 通过class编写: 标签名.class属性值
3.2 xpath 定位
表达式描述**//从当前节点获取子孙节点/从当前节点获取直接子节点@选取属性[ ]*添加筛选条件获取当前节点**获取当前节点的父节点nodename获取该节点的所有子节点
- XPath:即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言。它被开发者采用来当作小型查询语言.
- 获取xpath路径有两种方式:- 通过开发者工具复制 xpath 路径:
driver.find_element(By.XPATH,'//*[@id="kw"]')
- 手工编写 xpath 路径:1.纯标签路径:纯标签路径分两种:一种是绝对路径,另一种是相对路径, 以百度首页输入框为例: 1. 绝对路径:/html/body/div/div/div[5]/div/div/form/span[1]/input
1. 相对路径://form/span[1]/input
2.标签和属性相结合:语法://标签名[@属性名=属性值]//input[@id='kw']# 查找input标签中属性id值为kw的页面元素//*[@id='kw']# 查找属性为id=‘kw'的页面元素//span/input[@id='kw']# 标签也可以有多个//span[@class='bg s_ipt_wr quickdelete-wrap']/input# 还可以使用上层标签的属性帮助定位
3. xpath 模糊匹配:- starts-with: 以什么开头//input[starts-with(@type,"sub")]# 查找input标签中type属性,其值以sub开头的页面元素
- ends-with: 以什么结尾(注:chrome使用的是xpath1.0版本,不支持此项模糊查询)//input[ends-with(@type,"mit")]# 查找input标签中type属性,其属性值以mit结尾的页面元素
- contains: 包含//input[contains(@class,'s_btn')]# 查找input标签中class属性中含有“s_btn”字符串的页面元素
- contains: 包含text//div[contains(text(),"热榜")]# 查找div标签中文本中含有“热榜”的页面元素
3.3 link_text 定位
- link_text定位文字链接:
driver.find_element(By.LINK_TEXT,'新闻').click()
3.4 partial_link_text 定位
- partial_link_text通过部分文字定位文字链接:
driver.find_element(By.PARTIAL_LINK_TEXT,'新').click()
3.5 relative 相对定位
- to_left_of:定位位于指定元素左侧的元素。
- to_right_of:定位位于指定元素右侧的元素。
- above:定位位于指定元素上方的元素。
- below:定位位于指定元素下方的元素。
from selenium.webdriver.support.relative_locator import locate_with
# 获取相对元素
text_locator = locate_with(By.ID,'kw').to_left_of({By.ID:"kw"})# 注意:# 目前不知道这个元素能干什么,后续补充!
4. 添加等待时间
4.1 休眠等待:time(调式)
- 有时候为了保证脚本运行的稳定性,需要脚本中添加等待时间, 添加休眠:
import time # 先导入模块文件
sleep(3)# 休眠3秒
4.2 显式等待:Explicit Waits(常用)
- 显式等待主要是使用WebDriverWait来实现,其语法格式如下:
from selenium.webdriver.support.wait import WebDriverWait
WebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exceptions=None)# driver:浏览器驱动;# timeout:最长超时时间,默认以秒为单位;# poll_frequency:检测的间隔步长,默认为0.5s;# ignored_exceptions:超时后的抛出的异常信息,默认抛出NoSuchElementExeception异常。
在使用WebDriverWait时,需要搭配until或until_not方法来使用,其语法格式如下:
until(method, message='')
until_not(method, message='')# method:指定预期条件的判断方法;# message:超时后抛出的提示;
- 示例:
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# 创建 Wait 对象
wait = WebDriverWait(driver,2,0.3)
wait.until(EC.title_is('标题'))# 后续操作
方法描述类型title_is(‘’)判断当前页面的 title 是否等于预期布尔title_contains(‘’)判断当前页面的 title 是否包含预期字符串布尔presence_of_element_located(locator)判断元素是否被加到了 dom 树里,并不代表该元素一定可见WebElementvisibility_of_element_located(locator)判断元素是否可见,可见代表元素非隐藏,并且元素的宽和高都不等于0WebElementvisibility_of(element)跟上一个方法作用相同,但传入参数为 elementWebElementtext_to_be_present_in_element(locator ,‘’)判断元素中的 text 是否包含了预期的字符串布尔text_to_be_present_in_element_value(locator ,‘’)判断元素中的 value 属性是否包含了预期的字符串布尔frame_to_be_available_and_switch_to_it(locator)判断该 frame 是否可以 switch 进去,True 则 switch 进去,反之 False布尔invisibility_of_element_located(locator)判断元素中是否不存在于 dom 树或不可见布尔element_to_be_clickable(locator)判断元素中是否可见并且是可点击的布尔staleness_of(element)等待元素是否从 dom 树中移除布尔element_to_be_selected(element)判断元素是否被选中,一般用在下拉列表布尔element_selection_state_to_be(element,True)判断元素的选中状态是否符合预期,参数 element,第二个参数为 True/False布尔element_located_selection_state_to_be(locator,True)跟上一个方法作用相同,但传入参数为 locator布尔alert_is_present()判断页面上是否存在 alertalert
- 示例代码:
from time import sleep
from selenium import webdriver
from selenium.webdriver import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get('https://www.baidu.com/')
element = WebDriverWait(driver,2,0.5,ignored_exceptions=None).until(EC.presence_of_element_located((By.ID,'toolbar-search-input')),message='超时!')# 定位不存在的标签
element.send_keys('NBA',Keys.ENTER)
sleep(5)# 休眠5秒
driver.quit()# 关闭浏览器并释放进程资源
4.3 隐式等待:Implicit Waits
- 适用场景:一般在 Browser 初始化阶段(conftest文件中)使用。
driver.implicitly_wait(30)# 隐式地等待一个元素被发现或一个命令完成,这个方法每次会话只需要调用一次。
5. 浏览器操作(WebDriver方法)
5.1 获取信息
- 获取浏览器信息,其方法分别如下所示:
driver = webdriver.Chrome()
driver.title # 获取浏览器当前页面的标签
driver.current_url # 获取浏览器当前地址栏的URL
driver.page_source # 获取当前html源码
driver.name # 获取浏览器名称(chrome)
driver.current_window_handle # 窗口句柄
driver.window_handles # 当前窗口的所有句柄
driver.get_window_rect()# 获取浏览器尺寸,位置
driver.get_window_position()# 获取浏览器位置(左上角)# 运行结果:{'width':1552,'height':840}{'x':-8,'y':-8}
5.2 导航
- 浏览器导航,其实现方法分别为:
driver.forward()# 浏览器前进
driver.back()# 浏览器后退
driver.refresh()# 刷新必应网页
5.3 切换框架(iframe)
- 使用 WebElement:
# 存储网页元素
iframe = driver.find_element(By.CSS_SELECTOR,"#modal > iframe")# 切换到选择的 iframe
driver.switch_to.frame(iframe)# 单击按钮
driver.find_element(By.TAG_NAME,'button').click()
- 使用 name 或 id:
# 通过 id 切换框架
driver.switch_to.frame('buttonframe')# 单击按钮
driver.find_element(By.TAG_NAME,'button').click()
- 使用索引:
# 基于索引切换到第 2 个 iframe
iframe = driver.find_elements(By.TAG_NAME,'iframe')[1]# 切换到选择的 iframe
driver.switch_to.frame(iframe)
- 离开框架:
# 切回到默认内容
driver.switch_to.default_content()
5.4 切换窗口(window)
# 打开新闻 Tab 标签
driver.find_element(By.LINK_TEXT,'新闻').click()# 休眠 1 秒
sleep(1)# 切换到第一个 Tab 标签
driver.switch_to.window(driver.window_handles[0])
5.5 屏幕截图
常用的截图方法如下:
方法描述driver.save_screenshot(filename)获取当前屏幕截图保存为指定文件,filename指定为完整保存路径或文件名driver.get_screenshot_as_base64()获取当前的屏幕截图 base64 编码字符串driver.get_screenshot_as_file(filename)获取当前的屏幕截图,使用完整的路径driver.get_screenshot_as_png()获取当前屏幕截图的二进制文件数据获取当前屏幕截图的案例:
from time import sleep, strftime, localtime, time
# 文件路径名
filename = os.path.abspath(os.path.dirname(__file__))+'/screenshot.png'
filename ='screenshot.com'# 图片的时间信息
st = strftime("%Y-%m-%d-%H-%M-%S", localtime(time()))
filename = st +'.png'# 获取屏幕截图
driver.save_screenshot(filename)
- 获取截屏保存到文件夹中:
import os
from time import sleep, strftime, localtime, time
# 图片的时间信息
st = strftime("%Y-%m-%d-%H-%M-%S", localtime(time()))
file_name = st +'.png'# 路径
path = os.path.abspath('screenshot')
file_path = path +'/'+ file_name
# 获取屏幕截图
driver.save_screenshot_as_file(file_path)
6. 元素操作(WebElement方法)
常用的元素操作方法如下:
方法描述text获取元素文本内容rect获取元素位置信息click()单击左键send_keys()输入内容clear()清除内容submit()提交表单get_attribute(“属性”)获取属性值is_selected()是否被选中is_enabled()是否可用is_displayed()是否显示value_of_css_property()css 属性值6.1 鼠标操作(click)
常用的鼠标操作方法如下:
方法描述click()单击左键context_click()单击右键double_click()双击左键drag_and_drop()鼠标拖动move_to_element()鼠标悬停execute_script()界面滑动perform()执行所有ActionChains中存储的动作单击左键
from selenium.webdriver.common.by import By
element = driver.find_element(By.ID,'su')#定位元素
element.click()# 给元素 单击左键
- 单击右键
- 依赖:pyautogui第三方支持右键菜单元素操作
import pyautogui
from selenium.webdriver.common.by import By
from selenium.webdriver import ActionChains
#定位元素
element = driver.find_element(By.ID,'su')# 给元素 单击右键
ActionChains(driver).context_click(element).perform()# 等待2s
sleep(2)#
pyautogui.typewrite(['down','down','return'])
- 双击左键
from selenium.webdriver.common.by import By
from selenium.webdriver import ActionChains
# 定位元素
element = driver.find_element(By.ID,'su')# 给元素 双击左键
ActionChains(driver).double_click(element).perform()
- 鼠标拖动
from selenium.webdriver.common.by import By
from selenium.webdriver import ActionChains
# 定位要拖动的元素
source = driver.find_element('选择器','xxx')# 定位目标元素
target = driver.find_element('选择器','xx')# 执行拖动动作
ActionChains(driver).drag_and_drop(source, target).perform()
- 鼠标悬停
from selenium.webdriver.common.by import By
from selenium.webdriver import ActionChains
#定位元素
element = driver.find_element(By.XPATH,'"//div/a[@class='s-bri c-font-normal c-color-t']"')# 给元素 鼠标悬停
ActionChains(driver).move_to_element(element).perform()
6.2 键盘操作(send_keys)
作用:模拟键盘输入内容。
在webdriver中的keys类中,提供了很多按键方法,常用的按键操作有:
操作描述Keys.ENTER回车键Keys.BACK_SPACE删除键Keys.F1F1键Keys.SPACE空格Keys.CONTROLCtrl键Keys.TABTab键Keys.ESCAPEESC键Keys.ALTAlt键Keys.SHIFTShift键Keys.ARROW_UP向上箭头Keys.ARROW_RIGHT向右箭头Keys.ARROW_DOWN向下箭头Keys.ARROW_LEFT向左箭头回车键操作案例:
from selenium.webdriver.common.by import By
from selenium.webdriver import Keys
# 定位元素
element = driver.find_element(By.ID,'kw')# 给元素 双击左键
element.send_keys('selenium', Keys.ENTER)
- 复制,粘贴操作案例:
from selenium.webdriver.common.by import By
from selenium.webdriver import Keys
# 定位元素
element = driver.find_element(By.ID,'kw')# 全选文本
element.send_keys(Keys.CONTROL,'a')
element.send_keys(Keys.CONTROL,'c')
element.send_keys(Keys.CONTROL,'v')
6.3 其它操作(4种)
- 清除输入框的内容:clear()
from selenium.webdriver.common.by import By
# 定位搜索输入框,向搜索输入框中输入文本“selenium"
element = driver.find_element(By.ID,'kw').send_keys('selenium')# 等待2s
sleep(2)# 清除搜索输入框中的文本
element.clear()
- 提交表单:submit()
from selenium.webdriver.common.by import By
# 定位搜索输入框,向搜索输入框中输入文本“selenium"
driver.find_element(By.ID,'kw').send_keys('selenium')#定位搜索按钮,并提交表单
driver.find_element(By.ID,'su').submit()
- 获取元素文本内容:text
from selenium.webdriver.common.by import By
# 定位文本框
element = driver.find_element(By.CSS_SELECTOR,'#bottom_layer > div > p:nth-child(3) > a')# 等待2s
sleep(1)# 打印出元素文本内容print('get text:', element.text)
- 获取页面元素属性:get_attribute(“属性”)
from selenium.webdriver.common.by import By
# 定位文本输入框
element = driver.find_element(By.ID,'kw')# 打印文本输入框的 name 属性print(f'the attribute value of element is: {element.get_attribute("name")}')
7. 下拉框操作(Select)
常用的下拉框操作方法如下:
方法/属性方法/属性描述select_by_value()根据值选择select_by_index()根据索引选择select_by_visible_text()根据文本选择deselect_by_value()根据值反选deselect_by_index()根据索引反选deselect_by_visible_text()根据文本反选deselect_all()反选所有options所有选项all_selected_options所有选中选项first_selected_option第一个选中选项根据值选择案例:
from selenium.webdriver.support.select import Select
# 定位下拉框
element = driver..find_element_by_name('selects')# 选择选项
Select(element).select_by_visible_text('北京')
8. 提示框操作(Prompt box)
- alert 框: 只有一个确定按钮。
# 定位 alert 框
driver.find_element(By.ID,'alert').click()# 切换到 alert 框
alert = driver.switch_to.alert
# 点击确认
alert.accept()
- confirm 框 :两个按钮,一个“确定”按钮,另一个是“取消”按钮。
# 定位 confirm 框
driver.find_element(By.ID,'confirm').click()# 切换到 confirm 框
confirm = driver.switch_to.alert
# 点击确认
confirm.accept()# 点击取消
confirm.dismiss()
- prompt 框: 一个文本输入框,一个”确定“按钮和一个”取消“按钮。
# 定位 prompt 框
driver.find_element(By.ID,'prompt').click()# 切换到 prompt 框
prompt = driver.switch_to.alert
# 向 prompt 框发送消息
prompt.send_keys('lisainfsad')# 点击确认
prompt.accept()# 点击取消
prompt.dismiss()
9. 执行 JS 脚本
- 界面滑动案例:
# 使用execute_script方法执行JavaScript代码来实现鼠标滚动
js='window.scrollTo(0, 500);'# 向下滚动 500 像素
driver.execute_script(js)
10. PO(page object) 框架
版权归原作者 憨憨李四 所有, 如有侵权,请联系我们删除。