自动化测试工具 selenium 学习笔记

前言

最近学习了测试课程部分的自动化测试,第一次发现这玩意挺有趣的,用 python 语言编写自动化脚本,竟然可以直接来操作浏览器,彻底解放双手。这篇文章只是简单的总结了操作 API 一些常用操作,还请大佬们勿喷!!!


介绍

selenium工具:自动化测试工具,UI测试工具。特点是轻量免费,支持多语言多平台,支持分布式
webdriver:是 selenium2 提供的一种用于操作浏览器的 api 接口,要操作那个浏览器,就要把那个浏览器的版本驱动放到 python 的安装路径的 Scripts里

一个简单脚本介绍

# coding = utf-8
from selenium import webdriver
import time
driver = webdriver.Firefox()
time.sleep(3)
driver.get("http://www.baidu.com")
time.sleep(3)
driver.find_element_by_id("kw").send_keys("周杰伦")
time.sleep(3)
driver.find_element_by_id("su").click()
driver.quit()

解析

  • from selenium import webdriver
    要想使用selenium 的 webdriver 里的函数,首先把包导进来
  • driver = webdriver.Firefox()
    我们需要操控哪个浏览器呢?Chrome ,当然也可以换成Ie 或Firefox。browser 可以随便取,但后面要用它操纵各种函数执行。
  • driver .find_element_by_id(“kw”).send_keys(“selenium”)
    一个控件有若干属性id 、name、(也可以用其它方式定位),百度输入框的 id 叫kw ,我要在输入框里输入 周杰伦。
  • driver .find_element_by_id(“su”).click()
    搜索的按钮的id 叫 su ,我需要点一下按钮( click() )。
  • driver .quit()
    退出并关闭窗口的每一个相关的驱动程序
  • driver .close()
    close方法关闭当前的浏览器窗口,quit方法不仅关闭窗口,还会彻底的退出webdriver,释放与driver server之间的连接。所以简单来说quit是更加彻底的close,quit会更好的释放资源

1. 元素的定位

使用百度的搜索框包含的属性信息为例

id 和name 定位

   id 和 name 是我们最最常用的定位方式,因为大多数控件都有这两个属性,而且在对控件的id 和name 命名时一般使其有意义也会取不同的名字。通过这两个属性使我们找一个页面上的属性变得相当容易。

  • 通过 find_element_by_id("kw") 函数就是捕获到百度输入框

  • 通过 find_element_by_name("wd")函数同样也可以捕获百度输入框

class name 定位 和 tag name 定位

  class name 类名定位,如果类名不是唯一,或者修饰这个属性的使用了多个类名,也定位不到,不建议使用。tag name 为定位标签名的定位,比如input,h1,h2,a 等等。

  • 通过find_element_by_class_name("s_ipt")函数捕获百度输入框。
  • 通过find_element_by_tag_name("s_ipt")

link text 定位

  定位链接,有时候不是一个输入框也不是一个按钮,而是一个文字链接,我们可以通过 link

  • find_element_by_link_text("视频")
import time
from selenium import webdriver
drive = webdriver.Chrome()
drive.get("https://www.baidu.com/")
title = drive.title
drive.find_element_by_partial_link_text("视频").click()
time.sleep(8)
drive.quit()

XPath 定位

  XPath 是一种在XML 文档中定位元素的语言。因为HTML 可以看做XML 的一种实现,所以selenium 用户可是使用这种强大语言在web 应用中定位元素。XPATH的获取可以用chrome的F12开发者模式中Element-右键-copy-copy xpath来获取。

  • find_element_by_xpath("")
import time
from selenium import webdriver
drive = webdriver.Chrome()
drive.get("https://www.baidu.com/")
# 定位搜索框输入对应的key
drive.find_element_by_xpath("//*[@id='kw']").send_keys("马龙")
# 定位"百度一下"这个框,并获取点击事件
drive.find_element_by_xpath("//*[@id='su']").click()
# 等待8秒
time.sleep(8)
drive.quit()

CSS 定位

  CSS是一种语言,它被用来描述HTML 和XML 文档的表现。CSS 使用选择器来为页面元素绑定属性。这些选择器可以被selenium 用作另外的定位策略。CSS 的比较灵活可以选择控件的任意属性。

  • find_element_by_css_selector("#kw"),通过find_element_by_css_selector( )函数,选择取百度输入框的 id 属性来定义,CSS的获取可以用chrome的F12开发者模式中Element-右键-copy-copy selector来获取。
import time
from selenium import webdriver
drive = webdriver.Chrome()
drive.get("https://www.baidu.com/")

drive.find_element_by_css_selector("#kw").send_keys("马龙")
drive.find_element_by_css_selector("#su").click()

time.sleep(8)
drive.quit()

2. 操作测试对象

  • click 点击对象
  • send_keys 在对象上模拟按键输入
  • clear 清除对象的内容,如果可以的话
  • submit 提交表单,
  • text 用于获取元素的文本信息

2. 添加等待

time.sleep() :固定等待

驱动变量.implicitly_wait():智能等待,implicitly_wait()的用法应该比time.sleep() 更智
能,后者只能选择一个固定的时间的等待,前者可以在一个时间范围内智能的等待。

3. 打印信息

打印 tile 及 url
驱动变量.title
驱动变量.current_url

from selenium import webdriver
driver = webdriver.Chrome()
driver.get('http://www.baidu.com')
print driver.title # 把页面title 打印出来
print driver.current_url #打印url
driver.quit()

4. 浏览器的操作

  • maximize_window():浏览器最大化
  • set_window_size(480, 800):浏览器具体宽高
  • back():浏览器返回(后退)
  • forward():浏览器前进
  • 用 js 控制浏览器滚动条
import time
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://www.baidu.com/")
# 浏览器最大化
driver.maximize_window()
driver.find_element_by_id("kw").send_keys("张家齐")
driver.find_element_by_id("su").click()
# 浏览器长400px,宽1000px
time.sleep(3)
driver.set_window_size(400,1000)
time.sleep(3)
# js 实现浏览器滚动条到浏览器底端
js1 = "var q = document.documentElement.scrollTop=1000"
driver.execute_script(js1)
time.sleep(5)
# js 实现浏览器滚动条到浏览器顶端
js2 = "var q = document.documentElement.scrollTop=0"
driver.execute_script(js2)
time.sleep(5)
driver.quit()

5. 键盘事件

要想调用键盘按键操作需要引入 keys 包:

from selenium.webdriver.common.keys import Keys

通过send_keys()调用按键,例如:

send_keys(Keys.TAB) :调用 TAB 键
send_keys(Keys.ENTER) : 调用 回车 键

6. 鼠标事件

要想调用鼠标操作需要引入 ActionChains 包:

from selenium.webdriver.common.action_chains import ActionChains

例如表示鼠标右键用法:ActionChains(驱动事件).context_click(定位到的元素).perform()

  • context_click() 右击
  • double_click() 双击
  • drag_and_drop() 拖动
  • move_to_element() 移动
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
import time
driver = webdriver.Chrome()
driver.get("http://news.baidu.com")
qqq =driver.find_element_by_xpath(".//*[@id='s_btn_wr']")
ActionChains(driver).context_click(qqq).perform() #右键
ActionChains(driver).double_click(qqq).perform() #双击
#定位元素的原位置
element = driver.find_element_by_id("s_btn_wr")
#定位元素要移动到的目标位置
target = driver.find_element_by_class_name("btn")
#执行元素的移动操作
ActionChains(driver).drag_and_drop(element, target).perform()

7. 定位一组元素

  webdriver 可以很方便的使用 findElement 方法来定位某个特定的对象,不过有时候我们却需要定位一组对象,这时候就需要使用 findElements 方法。

用 python 语法,就是通过选取所有的 input 控件,根据它类型的不同,选出我们想要选择的类型然后获取点击事件

from selenium import webdriver
import time
import os
dr = webdriver.Chrome()
file_path = 'file:///' + os.path.abspath('checkbox.html')
dr.get(file_path)
# 选择页面上所有的input,然后从中过滤出所有的checkbox 并勾选之
inputs = dr.find_elements_by_tag_name('input')
for input in inputs:
if input.get_attribute('type') == 'checkbox':
input.click()
time.sleep(2)
dr.quit()

注意:get_attribute:获得属性值。

8. 多层框架/窗口定位

多层框架或窗口的定位:

  • switch_to_frame()
  • switch_to_window()

对于一个现代的web 应用,经常会出现框架(frame) 或窗口(window)的应用,这也就给我们的定位带来了一个难题。
有时候我们定位一个元素,定位器没有问题,但一直定位不了,这时候就要检查这个元素是否在一个frame 中,seelnium webdriver 提供了一个switch_to_frame 方法,可以很轻松的来解决这个问题。

switch_to_frame(nameor id or frame_element):

如果这个frame有name和id属性那么就用这两个属性就好,如果没有的话可以先用find_element_by_xxx方法找到这个frame元素,然后把这个元素传进去,这也是可行的。

9. 下拉框处理

  下拉框是我们最常见的一种页面元素,对于一般的元素,我们只需要一次就定位,但下拉框里的内容需要进行两次定位,先定位到下拉框,再定位到下拉框内里的选项。

如图所示,要选中下拉列表的第三个选项
自动化测试工具 selenium 学习笔记_第1张图片
代码如下:

from selenium import webdriver
import time
import os
driver = webdriver.Chrome()
# 拼 url
url = "file:///" + os.path.abspath("E:\\编程学习\\代码\\python\\Day1\\selenium2html\\drop_down.html")
driver.get(url)
driver.maximize_window()
time.sleep(3)
# 1.通过 tag name
options = driver.find_elements_by_tag_name("option")
for option in options:
    if option.get_attribute('value') == "10.69":
        option.click()
time.sleep(6)

# 2.通过 css selector
driver.find_element_by_css_selector("#ShippingMethod > option:nth-child(3)").click()
# 数组的方式去定位,操作
options[2].click()
time.sleep(6)
driver.quit()

10. alert、confirm、prompt 的处理

  • text 返回alert/confirm/prompt 中的文字信息
  • accept 点击确认按钮
  • dismiss 点击取消按钮,如果有的话
  • send_keys 输入值,这个alert\confirm 没有对话框就不能用了,不然会报错

未完待续…

你可能感兴趣的:(测试,定位,python,selenium)