第四章:Webdriver

4-1 Webdriver概述

Webdriver概述

 Webdriver(Selenium2)是一种用于Web应用程序的自动测试工具,它提供了一套友好的

API,与Selenium 1(Selenium-RC)相比,Webdriver的API更容易理解和使用,其可读性

和可维护性也大大提高。Webdriver完全是一套类库,不依赖于任何测试框架,除了

必要的浏览器驱动,不需要启动其他进程或安装其他程序,也不必像Selenium 1那样需要

先启动服务。

支持浏览器

Firefox

IE

Opera

Chrome

safari


支持语言

java

c#

php

python

perl

ruby


安装,卸载、查看

安装:pip install selenium==XXXX

卸载:pip uninstall selenium

查看版本号:

pip show selenium


浏览器运行

启动Firefox

FireFox 48以上版本

selenim 3.X + FireFox驱动--geckodriver

FireFox 48以下版本

selenium2.X 内置驱动

启动IE浏览器

IE9以上版本

selenium3.X + IE驱动

IE9以下版本

selenium2.X + 驱动


启动Chrome浏览器

selenium2.x/3.x + Chrome驱动


注意!

各个驱动下载地址:http://www.seleniumhq.org/download/


浏览器位数的版本和驱动版本要一致!如果是32bit浏览器而Driver是64bit则会导致脚本运行失败!

4-2 第一个自动化测试脚本

案例:

  • 启动火狐浏览器
  • 首先打开我要自学网页面,打印网页标题,等待3秒
  • 打开百度首页,打印网页标题,再等待2秒
  • 关闭浏览器
from selenium import webdriver
from time import sleep

#加载浏览器驱动
driver=webdriver.Firefox()

#打开自学网页面
driver.get("http://www.51zxw.net")
print(driver.title)
sleep(3)

#打开百度
driver.get("http://www.baidu.com")
print(driver.title)
sleep(2)

#关闭firefox浏览器
driver.quit()


4-3 多浏览器运行脚本

 

将浏览器驱动放到python安装目录


启动chrome浏览器

from selenium import webdriver
from time import sleep

#加载浏览器驱动
# driver=webdriver.Firefox()
driver=webdriver.Chrome()

#打开自学网页面
driver.get("http://www.51zxw.net")
print(driver.title)
sleep(3)

#打开百度
driver.get("http://www.baidu.com")
print(driver.title)
sleep(2)

#关闭firefox浏览器
driver.quit()


chromedriver与chrome各版本及下载地址

http://chromedriver.storage.googleapis.com/index.html


http://npm.taobao.org/mirrors/chromedriver/


4-4 浏览器操作方法

浏览器操作

浏览器窗口大小设置

页面前进后退

页面刷新


from selenium import webdriver
from time import sleep

driver=webdriver.Firefox()

driver.get('http://www.51zxw.net')
driver.maximize_window()
sleep(2)

driver.get('http://www.51zxw.net/list.aspx?cid=615')
driver.set_window_size(400,800)
driver.refresh()
sleep(2)

driver.back()
sleep(2)

driver.forward()

sleep(2)

driver.quit()


4-5 元素定位-id与name

元素定位

元素的定位是自动化测试的核心,要想操作一个元素,首先应该识别这个元素,

webdriver提供了一系列的元素定位方法,常用的有以下几种

id

name

class name

link text

partial link text

tag name

xpath

from selenium import webdriver
from time import sleep

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

# driver.find_element_by_id('kw').send_keys('Selenium 我要自学网')

driver.find_element_by_name('wd').send_keys('selenium 我要自学网')

sleep(5)

driver.find_element_by_id('su').click()

driver.quit()


 4-6 元素定位-tag_name

案例:打开我要自学网页面,在用户名输入框


from selenium import  webdriver
from time import sleep

driver=webdriver.Firefox()

driver.get('http://www.51zxw.com')

#定位标签名为input的元素
# driver.find_element_by_tag_name("input").send_keys("selenium")

#获取页面所有标签名称为"input"的标签
driver.find_elements_by_tag_name("input")[1].send_keys("selenium")

sleep(3)

driver.quit()


4-7 元素定位--class_name


根据标签中属性class来定位的一种方法

from selenium import webdriver
from time import  sleep

driver=webdriver.Firefox()

driver.get("http://baidu.com")

driver.find_element_by_class_name("s_ipt").send_keys("selenium")
sleep(2)

driver.find_element_by_id("su").click()

driver.quit()


4-8 link_text定位


link_text定位就是根据链接文字进行定位。

from selenium import webdriver
from time import sleep

driver=webdriver.Firefox()

driver.get('http://www.51zxw.net/')

driver.maximize_window()
driver.find_element_by_link_text('程序开发').click()
sleep(3)

driver.find_element_by_link_text('1-3 揭开自动化测试神秘面纱').click()
sleep(3)

driver.quit()


 4-9 xpath 定位--绝对与相对定位


xpath即为XML路径语言,它是一种用来确定XML文档中某部分位置的语言。Xpath基于XML的树状结构,

提供在数据结构树中拭寻节点的能力。


xpath绝对与相对定位


 
from selenium import webdriver
from time import sleep

driver=webdriver.Firefox()

driver.get('http://www.baidu.com')

#绝对路径定位
# driver.find_element_by_xpath("/html/body/div[1]/div[1]/div/div[1]/div/form/span[1]/input").send_keys('selenium')

#使用元素熟悉定位--定位到input标签中为kw的元素
# driver.find_element_by_xpath("//input[@id='kw']").send_keys("selenium")

#定位input标签中name属性为wd的元素
# driver.find_element_by_xpath("//input[@name='wd']").send_keys("selenium")

#定位input所有标签元素中,class属性为s_ipt的元素
driver.find_element_by_xpath("//input[@class='s_ipt']").send_keys("selenium")

sleep(3)
driver.find_element_by_id('su').click()


driver.quit()


 

4-10 xpath定位---层级与逻辑组合

 
from selenium import webdriver
from time import sleep

driver=webdriver.Firefox()


driver.get("http://www.51zxw.net/")


# 层级和属性组合定位--自学网首页输入用户名管密码
# driver.find_element_by_xpath("//form[@id='loginForm']/ul/input[1]").send_keys("test")
# sleep(3)

#逻辑运算组合定位
driver.find_element_by_xpath("//input[@class='loinp' and @name='username']").send_keys("hello")
sleep(3)
driver.find_element_by_xpath("//form[@id='loginForm']/ul/input[2]").send_keys(123456)
sleep(3)
driver.quit()




 

4-11 元素定位--css定位

css定位
selenium极力推荐使用css定位,而不是Xpath来定位元素,原因是CSS定位比xpath定位速度快,语法也更加简洁
css常用定位方法
  1. find_element_by_css_selector()
  2. #id id选择器根据id属性来定位元素
  3. .class class选择器,根据class属性值来定位元素
  4. [attribute='value']根据属性来定位元素
  5. slement>elemetn根据元素层级来定位 父元素>子元素
from selenium import webdriver
from time import sleep

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

# 通过#id选择器根据id属性来位元素
# driver.find_element_by_css_selector("#kw").send_keys('selenium')


#.class class选择器,根据class属性值来定位元素
# driver.find_element_by_css_selector(".s_ipt").send_keys("python")

#[attribute='value]根据属性来定位元素
# driver.find_element_by_css_selector("[autocomplete='off']").send_keys("hello")

#根据层级来定位父元素>子元素
driver.get("http://www.51zxw.com")
driver.find_element_by_css_selector("form#loginForm>ul>input").send_keys("hello333")

driver.find_element_by_css_selector("form#loginForm>ul>input[type='password']").send_keys("hello333")
sleep(2)

driver.quit()


 
 
 

4-13 下拉菜单列表选项定位

案例:在我要自学网登录页面选择指定的保留时间。
from selenium import webdriver
from time import sleep

driver=webdriver.Firefox()
driver.get("http://www.51zxw.net/")
sleep(2)

#根据option标签来定位
# driver.find_elements_by_tag_name('option')[1].click()

#根据css选择器属性值来定位
driver.find_element_by_css_selector("[value='2']").click()

sleep(2)
driver.quit()

4-14 下拉菜单列表选项定位


使用Select类定位

from selenium import webdriver
from time import sleep
from selenium.webdriver.support.ui import Select

driver=webdriver.Firefox()
driver.get("http://www.51zxw.net/")
sleep(2)


#利用Select类来进行定位
select = Select(driver.find_element_by_css_selector("[name='CookieDate']"))

select.select_by_index(1)
sleep(2)
select.select_by_visible_text("留一月")
sleep(2)
select.select_by_value("3")
sleep(2)
driver.quit()

4-15,4-16鼠标操作

实现思路
需要引入ActionChains类
然后定位相关元素
在ActionChains()调用相关鼠标操作方法

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from time import sleep

driver=webdriver.Firefox()

driver.get("http://www.baidu.com")
driver.maximize_window()

driver.find_element_by_css_selector("#kw").send_keys("python")
sleep(3)

element=driver.find_element_by_css_selector("#kw")
#双击操作
ActionChains(driver).double_click(element).perform()
sleep(2)

#右击操作
ActionChains(driver).context_click(element).perform()
sleep(2)

#鼠标悬停
above=driver.find_element_by_css_selector(".pf")
ActionChains(driver).move_to_element(above).perform()

sleep(4)
driver.quit()

4-17,4-18 键盘操作

键盘操作
案例:在百度搜索关键词“Python”然后将关键词或剪切到搜狗搜索框进行搜索


from selenium import webdriver
from time import sleep
from selenium.webdriver.common.keys import Keys

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

driver.find_element_by_css_selector("#kw").send_keys("python")
sleep(2)

#全选
driver.find_element_by_css_selector("#kw").send_keys(Keys.CONTROL,'a')

#复制或剪切
# driver.find_element_by_css_selector("#kw").send_keys(Keys.CONTROL,'c')
driver.find_element_by_css_selector("#kw").send_keys(Keys.CONTROL,'x')

driver.get("http://www.sogou.com")
sleep(2)

#粘贴关键词
driver.find_element_by_css_selector(".sec-input").send_keys(Keys.CONTROL,'v')
sleep(2)

driver.find_element_by_css_selector("#stb").click()
sleep(4)

driver.quit()




4-19 元素等待-显示等待(1)


元素等待
概念
显示等待是针对某一个元素进行相关等待判定
隐匿等待不针对某一个元素进行等待,全局元素等待
------------------------------------------------------------------
a.相关模块


WebDriverWait 显示等待针对元素必用
expected_conditions 预期条件类(里面包含方法可以调用,用于显示等待)
NoSuchElementexception 用于隐式等待抛出异常
By 用于元素定位


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
from selenium.common.exceptions import NoSuchElementException


案例:检测百度页面搜索按钮是否存在,存在就输入关键词“自学网 Selenium” 然后点击搜索


4-19 4-20 元素等待-显示等待(2)

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

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

driver.find_element_by_css_selector("#kw").send_keys("selenium")

element=WebDriverWait(driver,5,0.5).until(EC.presence_of_element_located((By.ID,'su')))
element.click()

sleep(3)
driver.quit()


4-21 元素等待-隐式等待

from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
from time import sleep,ctime

drive=webdriver.Firefox()
drive.get("http://www.baidu.com")
sleep(2)

#隐式等待时间设定5秒
drive.implicitly_wait(5)

#检测搜索框是否存在
try:
    print(ctime())
    drive.find_element_by_css_selector("#kw").send_keys("python")
    drive.find_element_by_css_selector("#su").click()
except NoSuchElementException as msg:
    print(msg)
finally:
    print(ctime())

sleep(3)
drive.quit()

4-22 frame嵌套页面元素定位(1)

案例:在Frame.html 文件中定位搜狗搜索页面,进行搜索操作
Frame.html
<html>
<head>
    <title>Frame_test</title>
</head>
<body>
    <div>
        <iframe id="search" src="http://www.sogou.com" width="800" height="500"></iframe>
    </div>
</body>
</html>


from selenium import webdriver
from time import sleep

drive=webdriver.Firefox()

#设置网页文件路径,r代表路径转义
file_path=r"D:\C\Selenium自动化测试\ch4\4-22-4-32script\Frame.html"

#路径转义另一种写法
#file_path='D:\\C\\Selenium自动化测试\\ch4\\4-22-4-32script\\Frame.html'
drive.get(file_path)

#切换到frame页面内
drive.switch_to.frame("search")

#定位到搜索框按钮输入关键词
drive.find_element_by_css_selector("#query").send_keys("python")
sleep(2)
drive.find_element_by_css_selector("#stb").click()
sleep(2)
drive.quit()


4-24 4-25 多窗口切换操作

案例:打开我要自学网Selenium课程主页,然后打开2-1课程详情页面,再回到课程主页打开3-1课程详情页面
from selenium import webdriver
from time import sleep

drive=webdriver.Firefox()

#打开selenium课程页面
drive.get("http://www.51zxw.net/list.aspx?cid=615")
#获取课程页面的窗口句柄
selenium_index=drive.current_window_handle

sleep(2)
#点击2-1课程链接,进入课程详情页面
drive.find_element_by_partial_link_text('2-1').click()
sleep(4)

#跳转到课程主页面窗口,点击3-1课程
drive.switch_to.window(selenium_index)
sleep(3)
drive.find_element_by_partial_link_text('3-1').click()
sleep(3)

drive.quit()


4-26 警告弹窗处理

案例:点击百度首页设置按钮,然后保存弹出警告窗口进行相关处理
from selenium  import webdriver
from time import sleep

driver=webdriver.Firefox()
driver.get("http://www.baidu.com")
driver.find_element_by_link_text("设置").click()
sleep(3)

driver.find_element_by_link_text("搜索设置").click()

sleep(3)

#driver.find_element_by_link_text("保存设置").click()
driver.find_element_by_link_text("恢复默认").click()
sleep(3)


#处理警告窗口
alert=driver.switch_to_alert()
alert.accept()

sleep(2)
driver.quit()

4-27 文件上传

案例:在百度搜索上传本地图片进行搜索
from selenium import webdriver
from time import sleep

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

driver.find_element_by_css_selector(".soutu-btn").click()
sleep(3)
driver.find_element_by_css_selector(".upload-pic").send_keys(r"D:\139-130\1c6748dba0ab1d21542b85118454319b.jpg")
sleep(10)

driver.quit()

4-28 浏览器滚动条操作

案例:打开我要自学网页面,然后将滚动条拖到最底部,然后现拖到顶部

from selenium import webdriver
from time import sleep

driver=webdriver.Firefox()
driver.get("http://www.51zxw.net")
sleep(2)

#将滚动条拖到最底部
js="var action=document.documentElement.scrollTop=10000"
driver.execute_script(js)
sleep(2)

#将滚动条拖动到最顶部
js="var action=document.documentElement.scrollTop=0"
driver.execute_script(js)
sleep(2)

driver.quit()


4-29网页自动截图

网页截图操作
案例:分别打开我要自学网和百度页面,然后进行截图
from selenium import webdriver
from time import sleep

#加载浏览器驱动
driver=webdriver.Firefox()

#打开自学网页面并截图
driver.get("http://www.51zxw.net")
driver.get_screenshot_as_file(r"D:\python\selenium自动化测试\ch4\51zxw.jpg")

#打开百度页面并截图
driver.get("http://www.baidu.com")
driver.get_screenshot_as_file(r"D:\python\selenium自动化测试\ch4\baidu.png")
sleep(2)

driver.quit()


4-30 Cookie处理

什么是Cookie
Cookie是储存在用户本地终端上的数据,实际上是一小段的文本信息。

Cookie作用
帮助Web站点保存相关访问者的信息。方便用户访问。如记住用户名密码实现自动登录。
案例:查看访问我要自学网时的Cookie内容。

from selenium import webdriver

driver=webdriver.Firefox()
driver.get("http://www.51zxw.net/")

#获取cookie全部内容
cookie=driver.get_cookies()

#打印全部cookie信息
print(cookie)

#打印cookie第一组信息
print(cookie[0])


#添加cookie
driver.add_cookie({'name':'51zxw','value':'www.51zxw.net'})
for cookie in driver.get_cookies():
    print("%s----%s" %(cookie['name'],cookie['value']))

driver.quit()




4-31 自动化测试验证码处理

验证码的作用
不少网站在用户登录、用户提交等登录和输入的页面上使用了验证码技术。验证码技术可以
有效防止恶意用户对网站的滥用,便得网站可以有效避免用户信息失窃、保证网站稳定安全性。

但是验证码给自动化测试带来一些不便,使脚本无法正常运行覆盖功能模块。
如何解决
1、去掉验证码
这是最简单的方法。对于开发人员来说,只是把验证码相关代码注释即可,如果是在测试环境,这样
做可以省去了测试人员不少麻烦,如果自动化脚本是要在正式环境跑,这样就给系统带来了一定的风险
2.设置万能码
去掉验证码的主要是安全问题,为了应对在线系统的安全性威胁,可以在修改程序时不取消验证码,
而是程序中留一个“后门”--设置一个“万能验证码”,只要用户输入这个“万能验证码”,程序就
认为验证通过,否则按照原先的验证方式进行验证。

3.验证码识别技术(OCR)
例如可以通过Python-tesseract 来识别图片验证码,Python-tesseract是学学字符识别TesseractOCR引擎的Pthon封装类。
能够读取任何常规的图片文件(JPG,GIF,PNG,TIFF等)。不过,目前市面上的验证码形式繁多,目前任何一种验证码码识别技术,
识别率都不是
	4.记录cookie
		通过向浏览器中添加cookie可以绕过登录的验证码。

4-32 基于Cookie绕过验证码自动登录

抓包软件Fiddler 4


案例:使用Cookie绕过百度验证码自动登录账户

from selenium import webdriver
from time import sleep

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


driver.add_cookie({'name':'BAIDUUID','value':'6B1D65DFFRREEF403D26FGGRFFGFDF1477E:FG=1'})
driver.add_cookie({'name':'BDUSS','value':'zJJci1oTXUxR1U13aF111GRTcmdHbmRHT2lUM1A0aXpKcVB6elA3fkxCbnhhQVFBQUFBJCQAAAAAAAAAAAEAAAAXetAKY2FzcGVyX2pvaG4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMt5VFrLeVRad'})
sleep(2)

driver.refresh()

sleep(3)


driver.quit()


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值