1.webdriver API
一个简单自动化脚本的构成:
打开百度搜索selenium
# coding = utf-8 设置编码模式
from selenium import webdriver # 导入webdriver工具包,这样就可以使用里面的API
import time
browser = webdriver.Firefox() # 获取浏览器(Firefox)驱动
time.sleep(3) # 休息3秒
browser.get("http://www.baidu.com")
time.sleep(3)
browser.find_element_by_id("kw").send_keys("selenium") # 定位元素“kw” 输入selenium
time.sleep(3)
browser.find_element_by_id("su").click() # 定位元素“su” click点击
browser.quit() # 关闭浏览器
UI测试:界面上进行元素的操作 先定位元素,再去操作元素
browser.quit() 退出并关闭窗口.清理浏览器的缓存,更好的释放资源
browser.close() 也可以关闭窗口
2.定位元素的方式
定位元素的原则,不管用什么方式定位,这个方式(tag_name,name,id等)必须全局唯一
- id 如果存在,可以全局唯一定位一个元素
- name 存在并且全局唯一才可以定位到
- class name 存在并且全局唯一才可以定位到
- link text 必须是链接,且链接内容全局唯一,才可以定位到
- partial link text 必须是链接,且链接内容全局唯一,才可以定位到
- tag name 必须全局唯一才可以定位到
- xpath 任何一个元素都可以定位到
- css selector
# 定位元素的方式
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get("https://www.baidu.com/")
time.sleep(3)
# # 通过 id 来定位 全局唯一,可以唯一定位一个元素
# # 锁定位置 输入梦华录send_keys("梦华录")
# driver.find_element_by_id("kw").send_keys("梦华录")
# time.sleep(3)
# # 锁定位置 点击click()
# driver.find_element_by_id("su").click()
# # 通过name来定位
# driver.find_element_by_name("wd").send_keys("赵盼儿")
# driver.find_element_by_id("su").click()
# # 通过 tag_name定位
# driver.find_element_by_tag_name("input").send_keys("孙二娘")
# driver.find_element_by_id("input").click()
# # class name定位 全局唯一
# driver.find_element_by_class_name("s_ipt").send_keys("孙二娘")
# driver.find_element_by_id("su").click()
# # link text定位 全局唯一
# driver.find_element_by_link_text("hao123").click()
# # partial link text 全局唯一
# driver.find_element_by_partial_link_text("123").click()
# # xpath 任何元素都可以定位到
# driver.find_element_by_xpath("//*[@id='kw']").send_keys("赵盼儿")
# driver.find_element_by_xpath("//*[@id='su']").click()
# css selector
driver.find_element_by_css_selector("#kw").send_keys("李逍遥")
driver.find_element_by_css_selector("#su").click()
time.sleep(5)
# 关闭浏览器
driver.quit()
3.操作测试对象
- send_keys( ) 向元素发送信息
- click( ) 点击元素
- submit( ) 提交表单
- clear( ) 清除元素的内容
# 操作测试对象
from selenium import webdriver
import time
driver = webdriver.Firefox()
driver.get("https://www.baidu.com/")
time.sleep(3)
# 搜索徐渭熊
driver.find_element_by_css_selector("#kw").send_keys("徐渭熊")
driver.find_element_by_css_selector("#su").submit()
time.sleep(6)
# 清除徐渭熊
driver.find_element_by_id("kw").clear()
time.sleep(5)
driver.find_element_by_id("kw").send_keys("徐骁")
# 提交搜索信息 和click作用一样
driver.find_element_by_id("su").submit()
time.sleep(5)
driver.quit()
5.text 获取元素的内容
from selenium import webdriver
import time
driver = webdriver.Firefox()
driver.get("https://www.baidu.com/")
time.sleep(3)
# 获取文本信息
text = driver.find_element_by_id("bottom_layer").text
print(text)
time.sleep(5)
driver.quit()
结果:
4.等待
当页面的元素没有加载出来的时候,无法定位到元素,因此等待的存在是非常有必要的
- 固定等待 sleep( ) (必须等够括号中的时间)
- 隐式等待(智能等待)
driver.implicitly_wait 等待页面上的元素加载出来后立刻去执行下一个相关指令
from selenium import webdriver
import time
driver = webdriver.Firefox()
driver.get("https://www.baidu.com/")
driver.maximize_window()
driver.find_element_by_id("kw").send_keys("林俊杰")
driver.find_element_by_id("su").click()
# # 固定等待
# time.sleep(5)
# 智能等待
driver.implicitly_wait(5)
driver.find_element_by_link_text("百度百科").click()
time.sleep(6)
driver.quit()
5.信息打印
打印 title
打印URL
from selenium import webdriver
import time
driver = webdriver.Firefox()
driver.get("https://www.baidu.com/")
time.sleep(3)
driver.maximize_window()
title = driver.title
print(title)
url = driver.current_url
print(url)
time.sleep(6)
driver.quit()
6.对浏览器的操作
(1)浏览器的最大化
driver.maximize_window()
(2)设置浏览器的宽和高
driver.set_window_size(400,1000)
(3)浏览器的前进和后退
后退:driver.back()
前进:driver.forward()
(4)浏览器滚动条的控制
# 浏览器滚动条的控制
# 底端
js0 = "var q=document.documentElement.scrollTop=10000"
driver.execute_script(js0)
time.sleep(3)
# 顶端
js1 = "var q=document.documentElement.scrollTop=0"
driver.execute_script(js1)
7.键盘事件
所有的键盘操作,必须立在定位到元素的基础上,因为我们是基于元素进行操作
导入工具包:from selenium.webdriver.common.keys import Keys
Keys.TAB
Keys.ENTER
组合键
导入工具包:from selenium.webdriver.common.action_chains import ActionChains
全选 send_keys(Keys.CONTROL,'a')
剪贴 send_keys(Keys.CONTROL,'x')
右击和双击(和点击的效果相同)取的前提是先定位元素
右击 ActionChains(driver).contxt_click(b).perform()
双击 ActionChains(driver).double_click(b).perform()
8.定位一组元素
(1)如何打开本地的HTML页面
拼成一个URL : file: + /// + 文件绝对路径
先导包:import os os.path.abspath(文件的绝对路径)
url = "file:///" + os.path.abspath("E:\\11\\测试文件\\selenium2html/checkbox.html")
(2)先定位出同一类元素(tag name,name,class name等),然后根据需要定位的元素的特征(type)去甄别出要定位的具体元素进行操作
from selenium import webdriver
import time
import os
driver = webdriver.Chrome()
url = "file:///" + os.path.abspath("E:\\11\\测试文件\\selenium2html/checkbox.html")
driver.get(url)
time.sleep(3)
driver.maximize_window()
# # 勾选里面所有的checkbox
# driver.find_element_by_id("c1").click()
# driver.find_element_by_id("c2").click()
# driver.find_element_by_id("c3").click()
# 定位一组tag name 都为input的元素
buttons = driver.find_elements_by_tag_name("input")
for button in buttons:
if button.get_attribute('type') == 'checkbox':
button.click()
time.sleep(5)
driver.quit()
9.多层框架的定位
iframe 框架里面嵌套框架
解决不同层框架上的页面的元素的定位
driver.switch_to.frame("f1")
(1)如果要定位一个层级框架中的元素,必须先调到这个框架层级,才可以定位
(2)如果要定位某一个层级,必须从默认页面跳转
driver.switch_to.default_content()
- default content——> f1 (√)
- f1 ——> f2 (√)
- default content ——> f2 (×)
- f2 ——> f1(×)
from selenium import webdriver
import time
import os
driver = webdriver.Chrome()
url = "file:///" + os.path.abspath("C:\\课件\\我的课件\\测试\\selenium2/locateElement/selenium2html/frame.html")
driver.get(url)
time.sleep(3)
driver.maximize_window()
# 从默认页面到 f1 框架页面
driver.switch_to.frame("f1")
driver.find_element_by_link_text("click").click()
# 回到默认页面
driver.switch_to.default_content()
driver.switch_to_frame()
time.sleep(6)
driver.quit()
10.层级定位
由link1找到Another action 让鼠标定位到Another action
from selenium import webdriver
import time
import os
from selenium.webdriver.common.action_chains import ActionChains
driver = webdriver.Chrome()
url = "file:///"+os.path.abspath("E:\\11\\测试文件\\selenium2html/level_locate.html")
driver.get(url)
driver.maximize_window()
# 定位link1,点击
driver.find_element_by_link_text("Link1").click()
driver.implicitly_wait(10)
# 定位 Another Action
action = driver.find_element_by_link_text("Another action")
# 高亮显示Another action, 把鼠标移动到 Another action上面
ActionChains(driver).move_to_element(action).perform()
time.sleep(6)
driver.quit()
11.下拉框选择
(1)直接用xpath定位
(2)先定位出一组元素(tag name等),然后根据元素的属性进行过滤筛选,再进行具体操作
(3)先定位出一组元素(tag name等),通过数组下标的方式定位
from selenium import webdriver
import time
import os
from selenium.webdriver.common.action_chains import ActionChains
driver = webdriver.Chrome()
url = "file:///"+os.path.abspath("E:\\11\\测试文件\\selenium2html/drop_down.html")
driver.get(url)
driver.maximize_window()
time.sleep(3)
# # xpath 定位
# driver.find_element_by_xpath("//*[@id='ShippingMethod']/option[3]").click()
options = driver.find_elements_by_tag_name("option")
# 方法1
# for option in options:
# if option.get_attribute('value') == '10.69':
# option.click()
# 方法2
options[2].click()
time.sleep(6)
driver.quit()
12.alert 弹框处理
# 定位弹出框/获得弹出框的操作句柄
alert = driver.switch_to.alert
# 关闭 alert
alert.accept()
如果弹框需要输入信息:
# 先获取弹出框的操作句柄
alert = driver.switch_to.alert
# 再用send_keys去输入信息
alert.send_keys("你好世界")
13.div块的处理
适用于页面复杂,元素非常多,没有id,并且name或者tag name 重复
(1)首先要定位元素所在的div模块
(2)在定位到的div模块的基础上去精确寻找需要定位的元素
# 点击div 框框里面的click me,让弹出框内容发生变化
div1 = driver.find_element_by_class_name("modal-body")
div1.find_element_by_link_text("click me").click()
time.sleep(4)
14.上传文件
定位上传按钮
send_keys(需要上传文件的绝对路径+文件名字)
driver.find_element_by_name("file").send_keys("C:\\Users\\lingqi\\Pictures/test.jpg")
15.为什么有些第三方网站的页面元素无法定位
比如网易邮箱登录时,用 id 进行定位,你每次打开页面或者刷新的时候 id 会变
为安全性考虑 因此无法定位
会有人恶意用自动化一直输入账号密码来盗取你的账号