selenium+Web测试

一、selenium

selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera,Edge等。这个工具的主要功能包括:测试与浏览器的兼容性——测试应用程序看是否能够很好得工作在不同浏览器和操作系统之上。测试系统功能——创建回归测试检验软件功能和用户需求。支持自动录制动作和自动生成.Net、Java、Per、Pythonl等不同语言的测试脚本。
这里只针对python来使用selenium

二. 使用

1. 下载驱动

测试浏览器需要下载对应浏览器对应的版本
浏览器一般在设置-关于xx浏览器中可看到具体版本号,记住下载需要
chrome浏览器:http://chromedriver.storage.googleapis.com/index.html
firefox浏览器:https://github.com/mozilla/geckodriver/releases
ie浏览器:http://selenium-release.storage.googleapis.com/index.html
Edge浏览器:https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/
Opera浏览器:https://github.com/operasoftware/operachromiumdriver/releases
下载后将其解压到python目录下,或者配置其环境变量

2. python下载selenium

pip install selenium

3. selenium方法

1.1 打开浏览器

from time import sleep
from selenium import webdriver
# executable_path 传驱动的安装路径,
# 如果没有将其放到python目录下或配置环境变量则需要加入该参数
driver=webdriver.Chrome(executable_path="D:\\XXX\\XXX\\chromedriver.exe")
# 打开浏览器  传入网址
driver.get("https://www.baidu.com")
sleep(1)
driver.get("https://www.csdn.net")
sleep(2)
# 后退
driver.back()
sleep(2)
# 前进
driver.forward()
sleep(1)
# 刷新页面
driver.refresh()
sleep(1)
# 浏览器窗口最大化
driver.maximize_window()
sleep(2)
# 关闭浏览器当前窗口
driver.close()
# 退出浏览器
driver.quit()

1.2 元素定位

需要导入from selenium.webdriver.common.by import By
从selenium 4.0版本开始弃用find_elements_by_id/name/xpath等等方法,
改为使用find_elements(by=By.ID, value=None),需要导入模块

from selenium.webdriver.common.by import By

注:

find_elements() return list webelement
加s返回的结果类型为list
find_element() return webelement
不加s返回定位到的第一个元素

id定位

id 为element属性中唯一的,值为全局唯一
id

result = driver.find_elements(By.ID, "app")
name定位

与id属性一致,值唯一
name

result_2 = driver.find_element(By.NAME, "keywords").get_attribute("content")
result_2 >> CSDN博客,CSDN学院,CSDN论坛,CSDN直播
class_name定位

element元素中的class属性,如果该元素上没id或name可以通过class_name
class_name

result = driver.find_element(By.CLASS_NAME, "blog-nav-box").get_attribute("class")
result >> blog-nav-box
tag_name定位

element的标签名,每个元素都有对应的标签名,每个标签名都有其对应功能,在同一个页面中相同的标签名会出现多次,详情请参考HTML标签https://www.runoob.com/tags/html-reference.html
tag_name

result = driver.find_elements(By.TAG_NAME, "div")
#返回多个结果,list类型
xpath定位

XPath 使用路径表达式来选取 XML 文档中的节点或者节点集,当然也适用于HTML
语法参考:https://www.runoob.com/xpath/xpath-syntax.html
也可以通过复制语法,选择需要定位的标签,右键找的复制
定位 复制

定位该元素xpath

result = driver.find_element(By.XPATH, '//div[@class="headswiper"][1]/div[@class="headswiper-content"][ 1]/div/div[1]/a[1]/strong[1]').text
# .text  获取该元素的文本属性
result >> Meta的AI顶尖人才都不干了?
css_selector定位

CSS选择器用于选择你想要的元素的样式的模式。
参考链接https://www.w3school.com.cn/cssref/css_selectors.asp
定位该元素

result_2 = driver.find_element(By.CSS_SELECTOR, '.headlines-right .headswiper:first-child div:nth-child(2) div div:first-child a.title strong').text
result_2 >> Meta的AI顶尖人才都不干了?
link_text定位

根据标签中含有超链接的文本定位
link_text

result = driver.find_element(By.LINK_TEXT, "数据结构与算法").text
result >> 数据结构与算法
partial_link_text定位

根据超链接的文本定位,支持模糊匹配
partial_link_text

result = driver.find_element(By.PARTIAL_LINK_TEXT, "数据结构")
result >> 数据结构与算法

1.3 模拟鼠标操作

ActionChains 能够通过代码实现鼠标的单击、双击、右键等待操作
需要导入该包

from selenium.webdriver.common.action_chains import ActionChains

selenium鼠标的操作方法很多,这里只展示单击、双击、右键这三个操作
调用某个方法,还需调用perform()方法才可执行操作

单击 click(on_element=None)
# 点击链接跳转网页
result = driver.find_element(By.PARTIAL_LINK_TEXT, "数据结构")
ActionChains(driver).click(result).perform()
sleep(2)
双击 double_click()

通过定位元素,进行翻页操作
double_click

result_2 = driver.find_element(By.CSS_SELECTOR, '#floor-www-index_558 > div > div.www-home-content.active > div.headlines > div.headlines-right > div:nth-child(1) > div.headswiper-top > p > img:nth-child(2)')
ActionChains(driver).double_click(result_2).perform()
右键 context_click()

相当于鼠标的右键操作,
接下来模拟鼠标右键打开新标签页,因为需要使用右键中的菜单栏选项,selenium实现不了,python引用一个第三方库pyautogui可通过pip安装

pip install pyautogui

result = driver.find_element(By.CSS_SELECTOR, '.headlines-right .headswiper:first-child div:nth-child(2) div div:first-child a.title strong')
ActionChains(driver).context_click(result).perform()
sleep(2)
pyautogui.typewrite(["down"])
sleep(2)
pyautogui.typewrite(['enter'])
sleep(2)

其他的方法就不一一列举了,这里给列出来

方法描述
click(on_element=None)单击鼠标左键
click_and_hold(on_element=None)单击鼠标左键,不松开
context_click(on_element=None)单击鼠标右键
double_click(on_element=None)双击鼠标左键
drag_and_drop(soure, target)拖动到某个元素然后松开
drag_and_drop_by_offset(soure,xoffset, yoffset)拖动到某个坐标然后松开
key_down(value, element=None)按下某个键盘上的键
key_up(value, element=None)松开某个键
move_by_offset(xoffset, yoffset)鼠标指针从当前位置移动到某个坐标
move_to_element(to_element)鼠标指针移动到某个元素
move_to_element_with_offset(to_element,xoffset,yoffset)移动到距某个元素(左上角坐标)多少距离的位置
perform()执行链中的所有动作
release(on_element=None)在某个元素位置松开鼠标左键
send_keys(*keys_to_send)发送某个键到当前焦点的元素
send_keys_to_element(element,*keys_to_send)发生某个键到指定的元素

1.4 模拟键盘操作

需要使用键盘操作同意需要导入模块

from selenium.webdriver.common.action_chains import ActionChains

定位到某个元素后使用send_keys(str>需要输入的值 or Keys.xxx>需要操作键盘的键)进行键盘操作,或者使用鼠标操作移动到某个元素再进行键盘操作,可使用组合键,再后面接着键盘操作,下面总结一些常见键,跟多请查看官网或源码

ActionChains(driver).click(result).send_keys(“数据结构”).send_keys(Keys.ENTER).perform()

方法描述方法描述
Keys.ENTER回车键Keys.CONTROL,“x”剪切(ctrl+X)
Keys.BACK_SPACE删除键Keys.CONTROL,“v”剪切(ctrl+V)
Keys.SPACE空格键send_keys(Keys.F1)F1 键
Keys.TABTAB键send_keys(Keys.F2)F2 键
Keys.ESCAPE回退键send_keys(Keys.F3)F3 键
Keys.F5刷新键send_keys(Keys.F4)F4 键
Keys.SHIFTShift键send_keys(Keys.F5)F5 键
Keys.ESCAPEESC键send_keys(Keys.F6)F6 键
Keys.ARROW_UP上键send_keys(Keys.F7)F7 键
Keys.ARROW_DOWN下键send_keys(Keys.F8)F8 键
Keys.ARROW_LEFT左键send_keys(Keys.F9)F9 键
Keys.RIGHT右键send_keys(Keys.F10)F10 键
EQUALS= 键send_keys(Keys.F11)F11 键
Keys.CONTROL,“a”全选(ctrl+A)send_keys(Keys.F12)F12 键
Keys.CONTROL,“c”复制(ctrl+C)

1.5 时间等待处理

执行脚本的速度很快,往往没有看到中间情况就已经结束了,接下来使用几个方法来等待时间或等待前面的执行完再执行
WebDriverWait() 显式等待
显示等待是只要条件成立,立即执行后续代码,如果没有满足条件,就会始终在这里等待条件成立,时间超出依然找不到,就抛出异常

from selenium.webdriver.support.ui import WebDriverWait
WebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exceptions=None)
driver: webdrive驱动程序
timeout: 最长等待时间,单位 s 秒
poll_frequency:休眠时间间隔(步长)时间, default 0.5
ignored_exceptions:超时后的异常信息,default>NoSuchElementException
.until(method,message='') 调用该方法提供的驱动程序作为一个参数,直到返回值不为False
.until_not(method,message='') 调用该方法提供的驱动程序作为一个参数,直到返回值为False
element = WebDriverWait(driver, 10).until(lambda x: x.find_element(By.ID, "app"))
is_disappeared = WebDriverWait(driver, 10, 1, ElementNotVisibleException).until_not(lambda x: x.find_element(By.ID, "app").is_displayed())
time.sleep() 强制等待

强制让程序暂停一段时间,时间到了才能继续运行。但是不智能,时间设置过短,某些元素还没有加载出来,则会报错。时间过长,浪费时间。

from time import sleep
sleep(2)

implicitly_wait 隐式等待

隐式等待,就是在创建driver时,为浏览器对象创建一个等待时间,这个方法是得不到某个元素就等待一段时间,直到拿到某个元素位置。
默认参数的单位为妙,本例中设置等待时长为10秒,首先这10秒并非一个固定的等待时间,它并不影响脚本的执行速度。其次,它并不针对页面上的某一元素进行等待。当脚本执行到某个元素定位是,如果元素可以定位,则继续执行,如果元素定位不到,则它将以轮询的方式不断地判断元素是否被定位到。假设在第六秒定位到了元素则继续执行,若直到超出设置的时长10秒还没有定位到元素,则抛出异常。

driver.implicitly_wait(2)

1.6 窗口切换

获取句柄,得到的是一个列表
handle = driver.windows_handles
切换窗口 切换到最后一个窗口
driver.swith_to_windows(handle[-1])
获取当前窗口
driver.current_window_handle()

1.7 删除某个元素的属性

比如点击超链接会跳转到一个新窗口,那么又需要切换窗口,而只需要修改该元素的一个target属性即可。

_blank在新窗口中打开被链接文档
_self默认 在相同的框架中打开被链接文档。
_parent在父框架集中打开被链接文档
_top在整个窗口中打开被链接文档
framename在指定的框架中打开被链接文档

使用:首先点位到元素,然后使用可以使用JS语法执行操作。执行JS的方法`driver.execute_srcipt(“js_syntax”)。
target

# js对属性的操作方法
# 给title属性赋值
js='document.getElementById("nice").setAttribute("title","测试title")'
# 删除title属性
js='document.getElementById("nice").removeAttribute("title")'
# 获取title属性的值
js='return document.getElementById("nice").getAttribute("title")'
# 修改title属性的值
js='document.getELementById("nice").title="测试"'
# 前面是使用id定位,使用class_name定位因为会有多个class值相同,所有返回的为list,并且使用的是getElementsByClassName(),加`s`复数形式,取值为索引即可

# 方法一 定位 > js修改其属性
result = driver.find_element(By.CSS_SELECTOR, '.headlines-right .headswiper:first-child div:nth-child(2) div div:first-child a.title strong')
# arguments[0]对应的是第一个参数,可以理解为python里的%s传参,与之类似。'.target'表示修改元素的target属性的值
# 1.1
driver.execute_script('arguments[0].target="_self"', result)
# 1.2
driver.execute_script('arguments[0].setAttribute("target", "_self")', result)

# 方法二  js_syntax > execute_script
js_syntax = 'document.getElementsByClassName("title")[0].setAttribute("target","_self")'
driver.execute_script(js_syntax)

# 获取属性值
js_syntax_2 = 'return document.getElementsByClassName("title")[0].getAttribute("target")'
result_2 = driver.execute_script(js_syntax_2)
print(result_2)

# 测试 
result = driver.find_element(By.CSS_SELECTOR, '.headlines-right .headswiper:first-child div:nth-child(2) div div:first-child a.title strong').click()

1.8 submit() 提交表单

selenium 中点击的有click() 但只是点击,不能提交表单数据与后端交互,所有还有一个submit() 方法,提交表单

# 定位登陆
driver.find_element('class name', 'login-button').click()
# 定位输入账户框 输入账户
driver.find_element('id', 'login-account-name').send_keys('username')
# 定位输入密码框 输入密码
driver.find_element('id', 'login-account-password').send_keys('password')
# 点击登陆 注:需要该登陆元素属性中type=‘submit’才可使用submit,否则报错
driver.find_element('id', 'login-button').submit()

1.9 下拉滚动条

可通过js进行滚动,也可使用键进行操作

# 1. js_syntax
js = ''window.scrollTo(0, 10000)
js_2 = 'document.documentElement.scrollTop=100000'
js_3 = 'document.documentElement.scrollLeft=100000'
# 0:左边距 ---->水平滚动条(下方滚动条)
# 10000:上边距------->垂直滚动条(一般为右边滚动条)
# 0 为最左/上边,数字大则往右/下边滑动
driver.execute_script(js)
# 2. keys
# Keys.PAGE_DOWN 往下翻页  Keys.PAGE_UP 往上翻页
driver.find_element('tag name', 'body').send_keys(Keys.PAGE_DOWN)

1.10 下拉框处理

<select></select>标签处理,需要导入模块。接下来换一个网址进行测试练习.首先切换到内置网页,再定位select标签,使用Select选择

driver.get('https://www.w3school.com.cn/tiy/t.asp?f=eg_html_select')
# switch_to.frame("id | name | element")  切换内置网页
driver.switch_to.frame("iframeResult")
select_el = driver.find_element('css selector', 'html select')
sleep(1)
Select(select_el).select_by_value('opel')
sleep(2)
方法描述
select_by_index()通过索引定位(0开始)
select_by_value()通过标签value属性的值定位
select_by_visible_text()通过文本值定位
deselect_all()取消所有选项
deselect_by_index()取消对应index选项
deselect_by_value()取消对应value选项
deselect_by_visible_text()取消对应文本值选项
first_selected_option()放回第一个选项
all_selected_options()放回所有选项

1.11 文件上传处理

使用selenium上传文件只需要定位到上传文件的标签,然后使用send_Keys()输入本地路径。

driver.find_element('name','file').send_Keys(r"D:\\xxx\xxx\xxx.png")

1.12 页面截图

driver.get_screenshot_as_file(filename)
driver.get_screenshot_as_file(r"D:\\xxx\xxx\xxx.png)

1.13 alert对话框处理

在进行某些操作时可能会弹出alert(警告框)对话框,不进行处理的话就不能继续下面的操作,并且无法通过定位的方式定位到。
alert分为三种情况:
警告框:只有一个“确定”的按钮
确认对话框:会询问你一个问题,需要选择“确定”or“取消”
提示对话框:提供一个文本输入框,需要输入对应所需的字段,然后点击“确定”or“取消”。

# 切换到对话框
element = driver.switch_to_alert()
# 点击确定
element.accept()
# 点击取消
element.dismiss()
# 输入值
element.send_Keys("hello")
  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sirLateautumn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值