Selenium是一个web自动化测试的工具,在使用之前先在对应的项目添加工具包噢.
本文章主要简单的介绍了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("要输入的内容") # 在弹窗的输入框中输入内容-如果有的话