Selenium是一个web自动化测试的工具,在使用之前先在对应的项目添加工具包噢.
本文章主要简单的介绍了selenium对于自动化测试的使用
目录
添加浏览器驱动
get函数来到对应网站
驱动的定位
元素定位
id定位
class name定位
CSS定位
XPath定位
link text定位
定位一组元素
层级定位
操作测试对象
等待
强制等待
显式等待
隐式等待
鼠标点击与键盘的输入
send_keys()
click()
submit()
text
打印信息
浏览器的操作
浏览器最大化
浏览器的宽与高
浏览器的前进与后退
键盘按键
常用按键方法
键盘组合键用法
鼠标事件
alert,conirm,prompt的处理
上传文件的操作
selenium简单使用流程
from selenium import webdriver #导包
browser = webdriver.Edge() #得到浏览器驱动
browser.get("https://www.baidu.com/index.htm")
通俗的说,页面通过句柄进行定位,句柄是页面的唯一标识
可以通过
driver.window_handles
来获取所有的句柄,也可以通过下面的方法获取最新页面的句柄
driver.switch_to.window(driver.current_window_handle) #获取当前页面的句柄,并将驱动重新定位到最新的页面
在获取后,通过switch_to.window方法重新定位浏览器驱动,这样才能进行后续的操作.
首先要进行导包
from selenium.webdriver.common.by import By
定位元素的方法有很多:
关键是"定位",当然是要定位到一个唯一的地址,当以上的id,name,class name在页面上不是唯一的时候,定位都会失败.
(可以在浏览器的开发者模式F12中,按下ctrl + f.输入要定位的元素的id或classname进行查看是否唯一)
图中显示有72个元素包含有container
通过元素的id进行定位
browser.find_element(By.ID, "kw")
name,tag name,class name都是与id定位一样的,但都是在唯一的前提下才能进行使用.
class我们可以只截取其一部分进行定位,如果一个元素的class为hello world
那么我们可以只把hello或world放上语句进行定位
在F12下,找到对应的元素.右键
选择slector,得到当前元素的CSS
browser.find_element(By.CSS_SELECTOR, "#kw")
与CSS类似的
browser.find_element(By.XPATH, "//*[@id='kw']")
像以上的文字链接,就可以使用这种方式(页面唯一时)
browser.find_element(By.LINK_TEXT,"hao123").click()
使用find_elements
可以找到多个元素,并以集合的形式存储
saveH3 = driver.find_elements(By.CLASS_NAME, "t") # 获取所有的t
for a in saveH3: # 遍历t中的a,获取文本并打印
data = a.find_element(By.TAG_NAME,"a").text
print(data)
在定位复杂一点的元素时,可以先定位到其父级元素,并再次定位进行寻找
driver.find_element(By.CLASS_NAME, "t").find_element(By.TAG_NAME,"a")
定位完元素之后当然是要对其进行操作啦.
在webdriver中常用的操作对象有:
在selenium中,等待分为隐式等待,显示等待与强制等待
time包中的sleep-单位为秒(s)
time.sleep(5) #页面强制等待5s
对特定的元素进行等待
#显式等待,直到元素被加载出来.条件是10s内,每0.5秒进行尝试点击.如果元素加载出来了就停止等待
#超过10s找不到就抛异常
tmp = WebDriverWait(browser,10,0.5).until(EC.presence_of_element_located((By.LINK_TEXT,'我的世界Minecraft中国版官方网站——你想玩的,这里都有')))
tmp.click()
隐式等待(设置一次,全局生效)
会对所有将要被操作元素进行等待
在下一个被操作的元素没有加载出来之前会进行等待,等待的时长为20,单位为秒
driver.implicitly_wait(20)
在输入框中输入文本
对元素进行点击
from selenium.webdriver.common.keys import Keys
driver.find_element(By.ID, "kw").send_keys("B站")
driver.find_element(By.ID, "kw").send_keys(Keys.ENTER)#对输入框的内容进行键盘上的Enter操作
提交表单,对type为submit类型的元素.触发表单的提交
获取元素的文本信息
driver.find_element(By.TAG_NAME,"a").text
页面的title,URL...都可以获取出来
但是驱动的title和URL等属性都是当前驱动所在页面的属性,并不是浏览器上最新页面的属性
例如:
在百度搜索结果页面,点开了一个超链接.新建了页面A
但此时浏览器驱动还是在百度搜索结果页面上,此时直接去搜索页面A的元素是会报错的
而通过driver.title获取页面的标题,得到的也只是百度搜索结果页面的标题,并不是A的标题
对页面的控制,
driver.maximize_window()
将页面调整至最大化
driver.set_window_size(#{宽},#{高})
driver.forward() # 前进 driver.back # 后退
模拟键盘操作,首先要导入keys包
from selenium.webdriver.common.keys import Keys # 键盘按钮包
通过键盘的输入方法send_keys来进行下面的操作
send_keys(Keys.TAB) # 按下tab
send_keys(Keys.ENTER) # 按下回车
send_keys(Keys.SPACE) # 按下空格
send_keys(Keys.ESCAPR) # 按下回车键
注意组合键后面的英文字母为小写
send_keys(Keys.CONTROL,'a') # 全选
ctrl + a send_keys(Keys.CONTROL,'c')
send_keys(Keys.CONTROL,'x')
send_keys(Keys.CONTROL,'v')
鼠标事件也要导入包
from selenium.webdriver.common.action_chains import ActionChains
ActionChains类 (执行链)中的方法有
这是关于弹窗的处理,首先来说明一下三个弹窗
alter = driver.switch_to.alert # 将驱动定位到当前弹窗:alert/confirm/prompt上
alter.text # 获取当前弹窗的文本
alter.accept() # 按下当前弹窗的确认键
alter.dismiss() # 按下当前弹窗的取消键-如果有的话
alter.send_keys("要输入的内容") # 在弹窗的输入框中输入内容-如果有的话
找到type为file的input标签,使用send_keys方法添加本地文件的路径
driver = webdriver.Edge()
driver.implicitly_wait(30)
driver.get("https://www.baidu.com/index.htm")
driver.maximize_window() # 设置页面最大化
driver.find_element(By.ID, "kw").send_keys("蜡笔小新")
driver.find_element(By.ID, "kw").send_keys(Keys.ENTER)
driver.switch_to.window(driver.current_window_handle)
saveH3 = driver.find_elements(By.CLASS_NAME, "t") # 获取所有的t
for a in saveH3: # 遍历t中的a,获取文本并打印
data = a.find_element(By.TAG_NAME, "a").text
print(data)
alter = driver.switch_to.alert # 将驱动定位到当前弹窗:alert/confirm/prompt上
alter.text # 获取当前弹窗的文本
alter.accept() # 按下当前弹窗的确认键
alter.dismiss() # 按下当前弹窗的取消键-如果有的话
alter.send_keys("要输入的内容") # 在弹窗的输入框中输入内容-如果有的话