selenium(python)自动化测试入门二(webdriver API)

Python webdriver API

1. 浏览器的操作

1.1 浏览器最大化

#coding=utf-8
from selenium import webdriver
driver = webdriver.Firefox()
driver.get("http://www.baidu.com")
print("浏览器最大化")
driver.maximize_window() #将浏览器最大化显示

1.2 设置浏览器宽、高

#coding=utf-8
from selenium import webdriver
driver = webdriver.Firefox()
driver.get("http://m.mail.10086.cn")
#参数数字为像素点
print("设置浏览器宽480、高800显示")
driver.set_window_size(480, 800)
driver.quit()

1.3 控制浏览器前进、后退

#coding=utf-8
from selenium import webdriver
import time
driver = webdriver.Firefox()
#访问百度首页
first_url= 'http://www.baidu.com'
print("now access %s" %(first_url))

driver.get(first_url)
#访问新闻页面
second_url='http://news.baidu.com'
print("now access %s" %(second_url))
driver.get(second_url)
#返回(后退)到百度首页
print("back to %s "%(first_url))
driver.back()
#前进到新闻页
print("forward to %s"%(second_url))
driver.forward()
driver.quit()

2. 简单对象定位

常见的元素定位方法有一下几种:

序号定位方式webdriver中方法
1idfind_element_by_id()
2namefind_element_by_name()
3class namefind_element_by_class_name()
4tag namefind_element_by_tag_name()
5link textfind_element_by_tag_name()
6partial link textfind_element_by_partial_link_text()
7xpathfind_element_by_xpath()
8css selectorfind_element_by_css_selector()

2.1 id和name定位

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

<input id="gs_htif0" class="gsfi" aria-hidden="true" dir="ltr">
<input type="submit" name="btnK" jsaction="sf.chk" value="Google 搜索">
<input type="submit" name="btnI" jsaction="sf.lck" value=" 手气不错 ">

通过id定位

find_element_by_id("gs_htif0")

通过name定位

find_element_by_name("btnK")
find_element_by_name("btnI")

2.2 tag name和class name定位

不是所有的前端开发人员都喜欢为每一个元素添加id和name两个属性,但除此之外你一定发现了一个元素不单单只有id和name属性,它还有class属性,而且每个元素都会标签

<div id="searchform" class="jhp_big" style="margin-top:-2px">
<form id="tsf" onsubmit="return name="f" method="GET" action="/search">
<input id="kw" class="s_ipt" type="text" name="wd" autocomplete="off">

通过class属性对元素进行定位

find_element_by_class_name("jhp_big")

通过tag标签名对元素进行定位

find_element_by_tag_name("div")
find_element_by_tag_name("form")
find_element_by_tag_name("input")

**注意:tag name 定位方式应该是所有定位方式中最不靠谱的一种了,在一个页面中具有相同tag name的元素及其容易出现

当需要操作的元素是一个文字链接时,我们可以通过link text和partial link text进行元素定位

<a href="http://news.baidu.com" name="tj_news">新 闻</a>
<a href="http://tieba.baidu.com" name="tj_tieba">贴 吧</a>
<a href="http://zhidao.baidu.com" name="tj_zhidao">一个很长的文字连接</a>

通过link text定位元素

find_element_by_link_text("新闻")
find_element_by_link_text("贴吧")
find_element_by_link_text("一个很长的文字链接")

通过partial link text定位元素

find_element_by_partial_link_text("新")
find_element_by_partial_link_text("贴")
find_element_by_partial_link_text("一个很长的")

2.3 XPath定位

<html class="w3c">
<body>
    <div class="page-wrap">
        <div id="hd" name="q">

            <form target="_self" action="http://www.so.com/s">
                <span id="input-container">
                <input id="input" type="text" x-webkit-speech="" autocomplete="off" suggestwidth="501px" >
                </span>
            </form>
        </div>
    </div>
</body>

使用绝对路径定位

find_element_by_xpth(" /html/body/div[2]/form/span/input")

使用相对路径定位

find_element_by_xpath(" //input[@id='input'] ") #通过自身的 id 属性定位
find_element_by_xpath(" //span[@id='input-container']/input") #通过上一级目录的id属性定位
find_element_by_xpath(" //div[@id='hd']/form/span/input") #通过上三级目录的 id 属性定位
find_element_by_xpath(" //div[@name='q']/form/span/input")#通过上三级目录的 name 属性定位

xpath缺点:
性能差
代码不够健壮
兼容性不好

2.4 css selector定位

css选择器常见语法

选择器含义
*通用元素选择器,匹配任何元素
E标签选择器,匹配所有使用 E 标签的元素
.infoclass 选择器,匹配所有 class 属性中包含 info 的元素
#footerid 选择器,匹配所有 id 属性等于 footer 的元素
E,F多元素选择器,同时匹配所有 E 元素或 F 元素,E 和 F 之间用逗号分隔
E F后代元素选择器,匹配所有属于 E 元素后代的F元素,E和F 之间用空格分隔
E>F子元素选择器,匹配所有 E元素的子元素 F
E+F毗邻元素选择器,匹配紧随 E 元素之后的同级元素 F (只匹配第一个)
E~F同级元素选择器,匹配所有在 E 元素之后的同级 F 元素
E[att='val']属性 att 的值为 val 的 E 元素 (区分大小写)
E[att^='val']属性 att 的值以 val 开头的 E 元素 (区分大小写)
E[att$='val']属性 att 的值以 val 结尾的 E 元素 (区分大小写)
E[att*='val']属性 att 的值包含 val 的 E 元素 (区分大小写)
E[att1='v1'][att2*='v2']属性 att1 的值为 v1,att2 的值包含 v2 (区分大小写)
E:contains('xxxx')内容中包含 xxxx 的 E 元素
E:not(s)配不符合当前选择器的任何元素

3.操作测试对象

webdriver常用的操作元素的方法

  • clear 清除文本框元素的内容
  • send_keys 在元素上模拟按键输入
  • click 单击元素
  • submit 提交表单
from selenium import webdriver
import time
driver = webdriver.Firefox()
url = "http://www.baidu.com"
driver.get(url)
time.sleep(3)

# 定位元素
el = driver.find_element_by_id('kw')
print(el)
print(type(el))
# 向输入框中输入数据
el.send_keys("selenium")
# 定位按钮之后点击操作
el = driver.find_element_by_id('su')
el.click()

time.sleep(5)
driver.close()

3.1 WebElement接口常用方法

  • size 返回元素的尺寸
# 返回百度输入框的宽高
size=driver.find_element_by_id("kw").size
print(size)
  • text 获取元素的文本
# 返回百度页面底部备案信息
text=driver.find_element_by_id("cp").text
print(text)
  • get_attribute(name) 获取属性值
#返回元素的属性值,可以是 id、name、type 或元素拥有的其它任意属性
attribute=driver.find_element_by_id("kw").get_attribute('type')
print(attribute)
  • is_displayed 设置该元素是否用户可见
#返回元素的结果是否可见,返回结果为 True 或 False
result=driver.find_element_by_id("kw").is_displayed()
print(result)

4.鼠标事件

ActionChains类常用的鼠标操作方法

  • context_click() 右击
  • double_click() 双击
  • drag_and_drop() 拖动
  • move_to_element() 鼠标悬停在一个元素上
  • click_and_hold() 按下鼠标左键在一个元素上

鼠标右击操作

'''
百度log右击
'''
from selenium import webdriver
# 导入动作链类
from selenium.webdriver import ActionChains

driver = webdriver.Firefox()
url = "http://www.baidu.com"
driver.get(url)

el_log = driver.find_element_by_xpath("/html/body/div[1]/div[1]/div/div[1]/div/div[1]/map/area")
# 鼠标右击操作,操作之前,需要将操作的元素定位出来传入相应的动作中,如果要执行需要添加perform方法
ActionChains(driver).context_click(el_log).perform()

perform() 执行所有ActionChains中存储的行为

鼠标双击

from selenium import webdriver
# 导入动作链类
from selenium.webdriver import ActionChains

driver = webdriver.Firefox()
url = "http://www.baidu.com"
driver.get(url)

el_log = driver.find_element_by_xpath("/html/body/div[1]/div[1]/div/div[1]/div/div[1]/map/area")
# 鼠标右击操作,操作之前,需要将操作的元素定位出来传入相应的动作中,如果要执行需要添加perform方法
ActionChains(driver).double_click(el_log).perform()

鼠标拖放操作

  • drag_and_drop(source, target)

在源元素上按下鼠标左键,然后移动到目标元素上释放。

source: 鼠标按下的源元素。

target: 鼠标释放的目标元素。

#引入 ActionChains 类
from selenium.webdriver.common.action_chains import ActionChains
...
#定位元素的原位置
element = driver.find_element_by_name("xxx")
#定位元素要移动到的目标位置
target = driver.find_element_by_name("xxx")
#执行元素的移动操作
ActionChains(driver).drag_and_drop(element, target).perform()
  • 鼠标移动到元素上
#引入 ActionChains 类
from selenium.webdriver.common.action_chains import ActionChains
...
#定位到鼠标移动到上面的元素
above = driver.find_element_by_xpath("xxx")
#对定位到的元素执行鼠标移动到上面的操作
ActionChains(driver).move_to_element(above).perform()
  • 按下鼠标左键
#引入 ActionChains 类
from selenium.webdriver.common.action_chains import ActionChains
...
#定位到鼠标按下左键的元素
left=driver.find_element_by_xpath("xxx")
#对定位到的元素执行鼠标左键按下的操作
ActionChains(driver).click_and_hold(left).perform()

5.键盘事件

#coding=utf-8
from selenium import webdriver
#引入 Keys 类包
from selenium.webdriver.common.keys import Keys
import time
driver = webdriver.Firefox()
driver.get("http://www.baidu.com")
#输入框输入内容
driver.find_element_by_id("kw").send_keys("selenium")
time.sleep(3)
#删除多输入的一个 m
driver.find_element_by_id("kw").send_keys(Keys.BACK_SPACE)
time.sleep(3)
#输入空格键+“教程”
driver.find_element_by_id("kw").send_keys(Keys.SPACE)
driver.find_element_by_id("kw").send_keys(u"教程")
time.sleep(3)
#ctrl+a 全选输入框内容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'a')
time.sleep(3)
#ctrl+x 剪切输入框内容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'x')
time.sleep(3)
#输入框重新输入内容,搜索
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'v')
time.sleep(3)
#通过回车键盘来代替点击操作
driver.find_element_by_id("su").send_keys(Keys.ENTER)
time.sleep(3)
driver.quit()

6.打印事件

7.设置等待时间

为保证脚本运行稳定,需要设置等待时间 sleep():设置固定休眠时间 implicitly_wait():是webdriver提供的一个超时等待。隐式的等待一个元素被发现,或一个命令完成,如果超时则抛出异常。 webDriveWait():同样也是webdriver提供的方法。在设置时间内,默认每隔一段时间检测一次当前页面元素是否存在

  • 显示等待
from selenium import webdriver

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Firefox()
url = "http://www.baidu.com"
driver.get(url)

'''
WebDriverWait类是由WebDirver 提供的等待方法。在设置时间内,
默认每隔一段时间检测一次当前页面元素是否存在,如果超过设置时间检测不到则抛出异常。

'''
WebDriverWait(driver, 10, poll_frequency=0.5, ignored_exceptions=None).until(EC.presence_of_element_located((By.ID, 's_mp')))
  • 隐式等待
from selenium import webdriver

driver = webdriver.Firefox()
url = "https://www.amazon.cn"
driver.get(url)

# 隐式等待   传入等待时间   单位秒
driver.implicitly_wait(20)

driver.close()
'''
	优先 隐式等待 	次之 显式等待 最次 固定等待
'''
  • sleep()
import time

time.sleep(6)

8.定位一组元素

find_elements_by_xx(‘xx’) find_elements 用于获取一组元素

9.层级定位

10.定位frame中的对象

from selenium import webdriver
import time
driver = webdriver.Firefox()
url = "http://126.com/"
driver.get(url)
time.sleep(4)
el_switch = driver.find_element_by_id("lbNormal")
el_switch.click()

# 定位到表单//*[@id="x-URS-iframe1564843083326.9932"]
# el_frame = driver.find_element_by_css_selector("#x-URS-iframe")
el_frame = driver.find_element_by_tag_name("iframe")
# 切换进入表单中000
driver.switch_to.frame(el_frame)


# 账号输入框
el_user = driver.find_element_by_name("email")
el_user.send_keys("hahha")

time.sleep(6)
driver.quit()

11.对话框处理

#coding=utf-8
from selenium import webdriver
driver = webdriver.Firefox()
driver.get("http://www.baidu.com/")
#点击登录链接
driver.find_element_by_name("tj_login").click()
#通过二次定位找到用户名输入框
div=driver.find_element_by_class_name("tang-content").find_element_by_name("userName")
div.send_keys("username")
#输入登录密码
driver.find_element_by_name("password").send_keys("password")
#点击登录
driver.find_element_by_id("TANGRAM__PSP_10__submit").click()
driver.quit()

12.浏览器多窗口处理

#coding=utf-8
from selenium import webdriver
import time
driver = webdriver.Firefox()
driver.get("http://www.baidu.com/")
#获得当前窗口
nowhandle=driver.current_window_handle
#打开注册新窗口
driver.find_element_by_name("tj_reg").click()
#获得所有窗口
allhandles=driver.window_handles
#循环判断窗口是否为当前窗口
for handle in allhandles:
    if handle != nowhandle:
        driver.switch_to_window(handle)
        print 'now register window!'
        #切换到邮箱注册标签
        driver.find_element_by_id("mailRegTab").click()
        time.sleep(5)
        driver.close()
#回到原先的窗口
driver.switch_to_window(nowhandle)
driver.find_element_by_id("kw").send_keys(u"注册成功!")
time.sleep(3)
driver.quit()

13.alert/confirm/prompt处理

#coding=utf-8
from selenium import webdriver
import time
driver = webdriver.Firefox()
driver.get("http://www.baidu.com/")
#点击打开搜索设置
driver.find_element_by_name("tj_setting").click()
driver.find_element_by_id("SL_1").click()
#点击保存设置
driver.find_element_by_xpath("//div[@id='gxszButton']/input").click()
#获取网页上的警告信息
alert=driver.switch_to_alert()
#接收警告信息
alert.accept()
dirver.quit()

14.下拉框处理

from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.support.select import Select
import time
driver = webdriver.Firefox()
url = "http://www.baidu.com"
driver.get(url)
time.sleep(3)
el_settings = driver.find_element_by_link_text("设置")
ActionChains(driver).move_to_element(el_settings).perform()

time.sleep(2)
el_search = driver.find_element_by_css_selector(".setpref")
el_search.click()
# 获取下拉框元素
el_select = driver.find_element_by_id("nr")
# 创建下拉框对象
selobj = Select(el_select)

# 通过选项索引进行选择
selobj.select_by_index(0)
time.sleep(1)
selobj.select_by_index(1)
time.sleep(1)
# 通过value值进行选择
selobj.select_by_value("50")
time.sleep(1)
selobj.select_by_value("20")
time.sleep(1)
selobj.select_by_value("10")
time.sleep(1)
# 通过可见文本进行选择
selobj.select_by_visible_text("每页显示50条")
time.sleep(1)
selobj.select_by_visible_text("每页显示20条")
time.sleep(1)
selobj.select_by_visible_text("每页显示10条")
time.sleep(1)

# 打印第一个选中的值
print(selobj.first_selected_option)
print(dir(selobj.first_selected_option))
print(selobj.first_selected_option.text)

el_save = driver.find_element_by_css_selector("#gxszButton > a.prefpanelgo")
el_save.click()

time.sleep(2)
# 进入警告框中,并且接受
driver.switch_to.alert.accept()
# driver.switch_to.alert.dismiss()

15.分页处理

16.上传文件

upload_file.html

<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
<title>upload_file</title>
<script type="text/javascript" async=""
src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<link href="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/css/bootstrap-combined.min.css"
rel="stylesheet" />
<script type="text/javascript">
</script>
</head>
<body>
<div class="row-fluid">
<div class="span6 well">
<h3>upload_file</h3>
<input type="file" name="file" />
</div>
</div>
</body>
<script src="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/js/bootstrap.min.js"></script>
</html>

操作上传脚本

#coding=utf-8
from selenium import webdriver
import os,time
driver = webdriver.Firefox()
#打开上传文件页面
file_path = 'file:///' + os.path.abspath('upload_file.html')
driver.get(file_path)
#定位上传按钮,添加本地文件
driver.find_element_by_name("file").send_keys('D:\\selenium_use_case\upload
_file.txt')
time.sleep(2)
driver.quit()

17.调用JavaScript

js.html

<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
<title>js</title>
<script type="text/javascript" async=""
src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<link href="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/css/bootstrap-combined.min.css"
rel="stylesheet" />
<script type="text/javascript">
$(document).ready(function(){
$('#tooltip').tooltip({"placement": "right"});
});
</script>
</head>
<body>
<h3>js</h3>
<div class="row-fluid">
<div class="span6 well">
<a id="tooltip" href="#" data-toggle="tooltip" title=" selenium-webdriver(python)">hover to see
tooltip</a>
<a class="btn">Button</a>
</div>
</div>
</body>
<script src="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/js/bootstrap.min.js"></script>
</html>
#coding=utf-8
from selenium import webdriver
import time,os
driver = webdriver.Firefox()
file_path = 'file:///' + os.path.abspath('js.html')
driver.get(file_path)
#######通过 JS 隐藏选中的元素##########第一种方法:
#隐藏文字信息
driver.execute_script('$("#tooltip").fadeOut();')
time.sleep(5)
#隐藏按钮:
button = driver.find_element_by_class_name('btn')
driver.execute_script('$(arguments[0]).fadeOut()',button)
time.sleep(5)
driver.quit()

18.控制浏览器滚动条

from selenium import webdriver
import time
driver = webdriver.Firefox()
url = "https://www.hao123.com"
driver.get(url)
time.sleep(3)

# 执行JS
js = "window.scrollTo(0,10) "
driver.execute_script(js)

# 循环下拉
for i in range(100):
    js = "window.scrollTo(0,%s) "%(i * 100)
    driver.execute_script(js)
    time.sleep(0.5)

19.cookie处理

webdriver操作cookie的方法有:

  • get_cookies() 获取所有cookie信息
  • get_cookie(name) 获取特定name有cookie信息
  • add_cokkie(cookie_dict) 添加cookie,必须有name和value值
  • delete_cookie(name) 删除特定的cookie
  • delete_all_cookies() 删除所有cookie信息
from selenium import webdriver
driver = webdriver.Firefox()
url = "http://www.youdao.com/"
driver.get(url)


# 获取cookies
data = driver.get_cookies()
print(data)

# 删除所有cookies
driver.delete_all_cookies()

# 设置cookies
cookie = {"name": "dyc", "value": "1111"}
driver.add_cookie(cookie)

data1 = driver.get_cookies()
print(data1)

20.验证码问题

处理验证码的几种方法:

  • 去掉验证码
  • 设置万能码(推荐)
  • 验证码识别技术
  • 设置cookie

selenium(python)自动化测试入门二(webdriver API)
https://www.diaoyc.cn//archives/seleniumpython%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E5%85%A5%E9%97%A8%E4%BA%8Cwebdriverapi
作者
Adiaoyc
发布于
2020年05月21日
许可协议