[测试] selenium自动化测试

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等)必须全局唯一

  1. id 如果存在,可以全局唯一定位一个元素
  2. name 存在并且全局唯一才可以定位到
  3. class name 存在并且全局唯一才可以定位到
  4. link text 必须是链接,且链接内容全局唯一,才可以定位到
  5. partial link text 必须是链接,且链接内容全局唯一,才可以定位到
  6. tag name 必须全局唯一才可以定位到
  7. xpath 任何一个元素都可以定位到
  8. 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.操作测试对象

  1. send_keys( ) 向元素发送信息
  2. click( ) 点击元素
  3. submit( ) 提交表单
  4. 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.等待

当页面的元素没有加载出来的时候,无法定位到元素,因此等待的存在是非常有必要的

  1. 固定等待 sleep( ) (必须等够括号中的时间)
  2. 隐式等待(智能等待)

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 会变

为安全性考虑 因此无法定位

会有人恶意用自动化一直输入账号密码来盗取你的账号

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值