该项目能够快速熟悉复习selenium webdriver
- -src 代码
- --package 顶包
- ---module 模块(package包下的模块)
- ----init.py 模块初始化
- ----test_selenium.py 模块
- -download_file 下载文件存放路径,通过chromeOptions capability设置
- -unittest_demo unittest selenium 示例代码
- -allure-2.17.2 allure报告
- -save_images webdriver 截图保存图片路径
- -webdriver_init.py webdriver 初始化(本地、远程、chromeoptions参数配置)
- -logging_init.py logging 初始化(日志初始化配置,每次触发写入本地文件和控制台)
- -report allure生成json、html报告存放位置
- -pytest.ini pytest单元测试框架配置文件
- -requirements.txt 依赖
# python -m venv 虚拟环境名称,名称是随意起的
python -m venv tutorial-env
当激活虚拟环境时命令行上会有个虚拟环境名前缀。
source tutorial-env/bin/activate
tutorial-env\Scripts\activate.bat
pip install -r requirements.txt
pip freeze > requirements.txt
pytest
pytest src/package/module/test_selenium.py
# 运行标注@pytest.mark.test的测试用例
pytest -m test
pytest -v
https://www.cnblogs.com/hl-2030/p/13690165.html?ivk_sa=1024320u
cd ~
vim .bash_profile
export ALLURE_HOME=/Users/liyinchi/workspace/python/python-learning/allure-2.17.2/
export PATH=$PATH:ALLURE_HOME/bin
allure --version
已在项目根目录下新建目录report,在report目录下html文件夹用于存放html报告
pytest -s -q --alluredir ./report
allure generate ./report -o ./report/html
- 实例化
form selenium import webdriver
driver=webdriver.Chrome()
- 打开、关闭、退出浏览器
webdriver.Chrome()
webdriver.Firfox()
driver.close()
driver.quit()
- 访问网页
driver.get("https://www.baidu.com")
- 网页后退、前进
访问多个不同域名或者路由地址后,可操作性
driver.back()
driver.forward()
- 等待
from time import sleep
sleep(2)# 等待2秒
- 刷新浏览器页面
driver.refresh()
- 窗口操作
driver.maximize_window() # 窗口最大化
driver.minimize_window()# 窗口最小化
driver.fullscreen_window()# 窗口全屏
driver.get_window_size() # 获取窗口大小
driver.set_window_size(500,500)# 设置窗口大小
driver.set_window_position(0,0) # 设置窗口位置
driver.get_window_position() # 获取窗口位置
- 网页标题(属性)
driver.title # 网页当前标题
driver.name # 当前实例浏览器名称
- 获取当前网页地址(属性)
driver.current_url
- 获取网页源码
driver.page_source
- 多窗口操作
handle_all=driver.window_handles # 获取所有窗口句柄
handle=driver.current_window_handle # 获取当前窗口句柄 (存储原始窗口句柄)
driver.switch_to.window(handle) # 切换到指定句柄窗口
driver.switch_to.window(handle_all[0]) # 切换到指定句柄窗口
assert len(driver.window_handles)==1 # 检查当前有没有其他开启的窗口
wait.until(EC.number_of_windows_to_be(2))# 等待打开两个窗口
# 遍历循环,找到新的窗口(存储当前所有窗口A=》打开新窗口=》获取当前所有窗口B 并遍历A和B差异)新窗口索引位置一般在最后一个???
- 多窗口操作(selenium 4)
driver.switch_to.new_window('tab') # 打开一个新标签时,并自动切换到新标签
driver.switch_to.new_window('window')# 打开一个新窗口时,并自动切换到新窗口
- 切换焦点
driver.switch_to_alert() # 切换到弹窗
driver.switch_to_default_content() # 切换焦点到主窗口(相对iframe/frame来说)
- 切换到iframe 或frame
driver.switch_to_frame(参数可以是frame的索引、名称或者元素) # 切换到frame或iframe
- 隐性等待
driver.implicity_wait(10) # 等待10秒
- 设置页面完全加载完 超时时间
driver.set_page_load_timeout(10)# 10秒
- 设置脚本执行的 超时时间
driver.set_script_timeout(10)# 10秒
8种单个元素定位方式,如果找到多个默认第一个
driver.find_element_by_id()
driver.find_element_by_name()
driver.find_element_by_class_name()
driver.find_element_by_tag_name() # html <input> 即tag name为input
driver.find_element_by_link_text() # html <a>新闻</a> 文字全匹配
driver.find_element_by_partial_link_text()# html <a>新闻</a> 文字部分匹配
driver.find_element_by_xpath()
driver.find_element_by_css_selector() # F12 元素复制 cssSelector
8中多个元素定位方式,返回一个列表,通过切片、索引来使用元素
driver.find_elements_by_id()
driver.find_elements_by_name()
driver.find_elements_by_class_name()
driver.find_elements_by_tag_name()
driver.find_elements_by_link_text()
driver.find_elements_by_partial_link_text()
driver.find_elements_by_xpath()
driver.find_elements_by_css_selector() # F12 元素复制 cssSelector
- find_element
driver.find_element(By.ID,"").send_keys("")
driver.find_element(By.NAME,"").send_keys("")
driver.find_element(By.ID,"").send_keys("")
driver.find_element(By.ID,"").send_keys("")
driver.find_element(By.ID,"").send_keys("")
driver.find_element(By.ID,"").send_keys("")
- xpath几种格式
.//标签[@属性名='属性值']
.//span[@title='custom_link']
.//标签[contains(text(),"标签内容")]
./span[contains(text(),"确定")]
注意:移动端 使用chrome://inspect/#devices工具定位H5元素,仅能使用第一种格式(.//标签[@属性="属性值"]),不能使用第二种(.//标签[contains(text(),"标签内容")])
.//标签名[contains(@属性名,'属性值')]
//iframe[contains(@src,“http://vrmstest2.maimaiche.com/ucvrms/repair/maintenance/list.do_;jsessionid=a11e054a-953a-457b-b294-35a10753d0e8?isInit=true“)]
- 获取html标签元素内容
driver.find_element_by_id(('div').text
- 复选框-判断是否选中状态(checkbox)
driver.find_element_by_tag_name('id_01').is_selected()
- 串联查询(在已找到元素层级基础上在继续往下查找)
driver.find_element_by_id('B').find_element_by_tag_name('div').text
- 通过父元素定位子元素
driver.find_element_by_xpath("//div[@id='B']/div").text
- 通过子元素定位父元素
# `.`代表当前节点; '..'代表父节点
mytext = driver.find_element_by_xpath("//div[@id='C']/../..").text
- xpath轴 (myhtml5-3.html)
mytext1 = driver.find_element_by_xpath("//div[@id='C']/parent::div/parent::div").text
- 弟弟元素定位哥哥元素
driver.find_element_by_xpath("//div[@id='D']/preceding-sibling::div[1]").text
- 获取元素属性
driver.find_element_by_id('kw').get_attribute('id') #打印搜索按钮的id属性
- 获取元素标签
driver.find_element_by_id('kw').tag_name
- 获取元素文本
driver.find_element_by_id('kw').text
- 获取元素大小
driver.find_element_by_id('kw').size
- 获取CSS属性值
driver.value_of_css_property("height")
- 判断页面元素是否可见
有时候找能找到元素,但是页面不显示,导致脚本报错
driver.find_element_by_id('kw').is_displayed()
- 判断页面元素是否可用
有时候找能找到元素,元素置灰不可点击,需要先判断是否可用,比如html元素加了属性disable 或者 元素被遮挡
driver.find_element_by_id('kw').is_enabled()
- 判断页面元素是否被选中
单选框、多选框
driver.find_element_by_id('kw').is_selected()
需要先引入鼠标操作包
from selenium.webdriver.common.action_chains import ActionChains
- 鼠标单击元素(左)
ActionChains(driver).click(元素).perform() # 传递driver ActionChains(driver);动作 click(元素);执行 perform()
- 鼠标双击元素(左)
ActionChains(driver).double_click(元素).perform() # 传递driver ActionChains(driver);动作 click(元素);执行 perform()
- 鼠标右击元素
ActionChains(driver).context_click(元素).perform() # 传递driver ActionChains(driver);动作 context_click(元素);执行 perform()
- 鼠标悬浮
ActionChains(driver).move_to_element(元素).perform() # 传递driver ActionChains(driver);动作 move_to_element(元素);执行 perform()
- 鼠标拖动
ActionChains(driver).drag_and_drop(起点元素,终点元素).perform() # 传递driver ActionChains(driver);动作 drag_and_drop(元素);执行 perform()
- 模拟鼠标的悬浮动作
driver.get("http://sahitest.com/demo/mouseover.htm")
ele = driver.find_element_by_xpath('/html/body/form/input[1]')
sleep(2)
# 通过move_to_element()来模拟鼠标的悬浮动作
ActionChains(driver).move_to_element(ele).perform()
ActionChains(driver).key_up()
- 文字输入
driver.find_element_by_id('bordercheck').send_keys("输入点东西")
- 组合键 (1)ctrl+c/a/v
import selenium.webdriver.common.keys import Keys;
driver.find_element_by_id("").send_keys(Keys.CONTROL,'a')
driver.find_element_by_id("").send_keys(Keys.CONTROL,'c')
driver.find_element_by_id("").send_keys(Keys.CONTROL,'v')
(2)按住ctrl键
import selenium.webdriver.common.keys import Keys;
import selenium.webdriver.common.action_chains import ActionChains;
ActionChains(driver).key_down(Keys.CONTROL).perform()
(3)空格键
可用于复选框选中 checkbox
driver.find_element_by_id("checkbox").send_keys(Keys.SPACE)
driver.send_keys("输入的内容") # 输入文字
driver.clear() # 清除文字
driver.get_property("value") # 获取输入框的内容
driver.find_element_by_id("").attribute('name') # 获取元素属性
driver.find_element_by_id("").tag_name; # 获取元素tag name
driver.find_element_by_id("").click() # button
driver.find_element_by_id("").submit() # button
driver.find_element_by_xpath(".//input[@type='radio']").is_selected() # radio 是否被选中 input type 为radio
实用空格键选中复选框、使用鼠标点击选中复选框
driver.find_element_by_id("checkbox").send_keys(Keys.SPACE)
driver.find_element_by_id("").click() # button
选中一组复选框(全选复选框)
eles=driver.find_elements_by_xpath(".//input[@type='checkbox']") # 找到所有复选框
# 遍历点击
for ele in eles:
ele.click()
driver.find_element_by_xpath(".//a[@type='link']").text
- select 元素、option子元素
# 两种方式
form selenium.webdriver.support.ui import Select
form selenium.webdriver.support.select import Select
# 3种选择方法
# 4种取消方法
# 3种属性,用于获取下拉列表选项
# 1种属性,判断是否可多选
from selenium.webdriver.common.action_chains import ActionsChains
from time import sleep
# 假设可输入,先输入后自动展开下拉列表,按键盘方向键向下,再按键盘回车键
driver.find_element_by_id('select').send_keys(b)
sleep(3)
driver.find_element_by_id('select').send_keys(Key.ARROW_DOWN)
sleep(3)
driver.find_element_by_id('select').send_keys(Key.ENTER)
driver.get("http://sahitest.com/demo/tableTest.htm")
table = driver.find_element_by_id('t2')
rows = table.find_elements_by_tag_name('tr')# 基于表格父节点,查找地址下子节点tag_name为tr的元素
cols = rows[0].find_elements_by_tag_name('td')# 查找地址下子节点tag_name为td的元素
for i in range(len(rows)):
for j in range(len(cols)):
cell = rows[i].find_elements_by_tag_name('td')[j]
print(cell.text)
- frame 用于全页面
driver.
- iframe 只用于局部页面
driver.switch_to.frame("iframe属性id")
driver.switch_to.frame("iframe属性name")
driver.switch_to.frame(0)
driver.switch_to.frame(iframe_element)
# 切换回主页面
driver.switch_to.default_content()
# 切回上一级页面
driver.switch_to.parent_frame()
1.警告类弹alert() 显示警告或其他信息,用于通知用户。 上方有【文本框】,下方只有一个【确认】按钮。 2.确认类弹窗confirm() 询问是否继续某种操作等功能。 上方有【文本框】,下方有【确认】和【取消】两种按钮。 3.消息类弹窗prompt() 需要输入一些信息。 上方【文字信息】、【文本框】,下方会有【确认】和【取消】按扭
在 WebDriver 中处理 JavaScript 所生成的 alert、confirm 以及 prompt 是很简单的。
具体做法是使用switch_to_alert()方法定位到 alert/confirm/prompt。
名称 | 用法 |
---|---|
accept() | 点击Alert的【确认】按钮 |
authenticate(username,password) | 给需要验证的Alert发送账号和密码,默认点击OK |
dismiss() | 点击Alert的【取消】按钮 |
send_keys(keysToSend) | 在Alert的输入框输入信息 |
text | 获取Alert上的文言信息 |
switch_to.alert | 切换到Alert然后使用 text/accept/dismiss/send_keys 按需进行操做。 |
4中常见操作:获取警告框的text消息、接受消息框(确定)、取消、输入值
- text属性,即返回alert/confirm/prompt 中的文字信息。
- accept方法,即点击确认按钮。
- dismiss方法,即点击取消按钮,如果有的话。
- send_keys方法,即输入值,这个 alert\confirm 没有对话框就不能用了,不然会报错。
# 接受弹窗
driver.switch_to.alert.accept()
# 得到弹窗的文本消息,比如得到:请输入用户名!
driver.switch_to.alert.text
print(message)
# 取消按钮
driver.switch_to.alert.dismiss()
# 输入值
driver.switch_to.alert.send_keys("输入内容")
当做正常元素去处理
driver.
- file类型
driver.
driver.
driver.
driver.
driver.
driver.
driver.
driver.
driver.
driver.
driver.
driver.
driver.
driver.
driver.
driver.
driver.
driver.
driver.
driver.
driver.
driver.
driver.
driver.
driver.
driver.
driver.
Redmine是一个项目管理和曲线跟踪系统,其功能和我们常见的项目管理、缺陷跟踪系统诶西。 *
driver.