coding=utf-8**
from selenium import webdriver
browser = webdriver.Firefox()
browser.get("http://www.baidu.com")#获得浏览器对象后,通过 get()方法,可以向浏览器发送网址
browser.find_element_by_id("kw").send_keys("selenium")#元素定位,input的id是kw。关于页面元素的定位后面将会详细的介绍,这里通过 id=kw 定位到百度的输入框,并通过键盘方法* *
browser.find_element_by_id("su").click() #单击按钮id为su
browser.quit() #退出并关闭窗口的每一个相关的驱动程序
#coding=utf-8**
from selenium import webdriver
driver=webdriver.Firefox()
'''
driver.get("http://www.baidu.com")
#参数数字为像素点
print "设置浏览情宽480,高800显示"
driver.set_window_size(480,800)
'''
'''
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()
pip install selenium
\2. 下载浏览器驱动
Firefox浏览器驱动:geckodriver
Chrome浏览器驱动:chromedriver , taobao备用地址
IE浏览器驱动:IEDriverServer
Edge浏览器驱动:MicrosoftWebDriver
Opera浏览器驱动:operadriver
PhantomJS浏览器驱动:phantomjs
需要把浏览器驱动放入系统路径中,或者直接告知selenuim的驱动路径
可以测试是否正常使用,以下代码:
用from selenium import webdriver
driver = webdriver.Firefox() # Firefox浏览器
# driver = webdriver.Firefox("驱动路径")
driver = webdriver.Chrome() # Chrome浏览器
driver = webdriver.Ie() # Internet Explorer浏览器
driver = webdriver.Edge() # Edge浏览器
driver = webdriver.Opera() # Opera浏览器
driver = webdriver.PhantomJS() # PhantomJS
find_element_by_id()
find_element_by_name()
find_element_by_class_name()
find_element_by_tag_name()
find_element_by_link_text()
find_element_by_partial_link_text()
find_element_by_xpath()
find_element_by_css_selector()
在element变成elements就是找所有满足的条件,返回数组。
WebElement 接口的其它更多方法请参考 webdriver API
#coding=utf-8*
from selenium import webdriver
driver = webdriver.Firefox()
driver.get("http://www.baidu.com")
size=driver.find_element_by_id("kw").size
print size
text=driver.find_element_by_id("cp").text
print text
attribute=driver.find_element_by_id("kw").get_attribute(*'type')
print attribute
result=driver.find_element_by_id("kw").is_displayed()
print result
#通过 submit() 来提交操作
#driver.find_element_by_id("dl_an_submit").submit()
**driver.quit()
在 WebDriver 中, 将这些关于鼠标操作的方法封装在 ActionChains 类提供。
ActionChains 类提供了鼠标操作的常用方法:
perform(): 执行所有 ActionChains 中存储的行为;
context_click(): 右击;
double_click(): 双击;
drag_and_drop(): 拖动;
move_to_element(): 鼠标悬停。
click_and_hold() 按下鼠标左键在一个元素上
举个例子:
from selenium import webdriver
# 引入 ActionChains 类
from selenium.webdriver.common.action_chains import ActionChains ##引入 ActionChains 类
driver = webdriver.Chrome()
driver.get("https://www.baidu.cn")
# 定位到要悬停的元素
above = driver.find_element_by_link_text("设置")
# 对定位到的元素执行鼠标悬停操作
ActionChains(driver).move_to_element(above).perform()
1都要先引入包,ActionChains 用于生成用户的行为;所有的行为都存储在 actionchains 对象。通过 perform()执行存储的行为。
2双击,悬停,按下鼠标左键:right变成double,left,above
3拖动
#定位元素的原位置
element = driver.find_element_by_name(“xxx”)
#定位元素要移动到的目标位置
target = driver.find_element_by_name(“xxx”)
#执行元素的移动操作
ActionChains(driver).drag_and_drop(element, target).perform()
以下为常用的键盘操作:
# 输入框输入内容
driver.find_element_by_id("kw").send_keys("seleniumm")
# 删除多输入的一个 m
driver.find_element_by_id("kw").send_keys(Keys.BACK_SPACE)
2
#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)
#回退
driver.find_element_by_id("su").send_keys(Keys.ESCAPE)
#制表键
driver.find_element_by_id("su").send_keys(Keys.TAB)
time.sleep(3)
driver.quit()
#获得前面 title,打印
title = driver.title
print title
#拿当前 URL 与预期 URL 做比较
if title == u"快播私有云":
print “title ok!”
else:
print “title on!”
#获得前面 URL,打印
now_url = driver.current_url
print now_url
#拿当前 URL 与预期 URL 做比较
if now_url == “http://webcloud.kuaibo.com/”:
print “url ok!”
else:
print “url on!”
#获得登录成功的用户,打印
now_user=driver.find_element_by_xpath("//div[@id=‘Nav’]/ul/li[4]/a[1]/span").text
print now_user
显式等待使WebdDriver等待某个条件成立时继续执行,否则在达到最大时长时抛出超时异常(TimeoutException)。
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()
driver.get("http://www.baidu.com")
element = WebDriverWait(driver, 5, 0.5).until(
EC.presence_of_element_located((By.ID, "kw"))
)
element.send_keys('selenium')
driver.quit()
WebDriverWait类是由WebDirver 提供的等待方法。在设置时间内,默认每隔一段时间检测一次当前页面元素是否存在,如果超过设置时间检测不到则抛出异常。具体格式如下:
WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)
在本例中,通过as关键字将expected_conditions 重命名为EC,并调用presence_of_element_located()方法判断元素是否存在。
如果某些元素不是立即可用的,隐式等待是告诉WebDriver去等待一定的时间后去查找元素。 默认等待时间是0秒,一旦设置该值,隐式等待是设置该WebDriver的实例的生命周期。
from selenium import webdriver
driver = webdriver.Firefox()
driver.implicitly_wait(10) # seconds
driver.get("http://somedomain/url_that_delays_loading")
myDynamicElement = driver.find_element_by_id("myDynamicElement")
sleep():设置固定休眠时间。python 的 time 包提供了休眠方法 sleep() ,导入 time包后就可以使用 sleep()
进行脚本的执行过程进行休眠。
implicitly_wait():是 webdirver 提供的一个超时等待。隐的等待一个元素被发现,或一个命令完成。
如果超出了设置时间的则抛出异常。
WebDriverWait():同样也是 webdirver 提供的方法。在设置时间内,默认每隔一段时间检测一次当前
页面元素是否存在,如果超过设置时间检测不到则抛出异常。
#coding=utf-8*
from selenium import webdriver
#导入 WebDriverWait 包
from selenium.webdriver.support.ui import WebDriverWait
#导入 time 包
import time
driver = webdriver.Firefox()
driver.get("http://www.baidu.com")
#WebDriverWait()方法使用
element=WebDriverWait(driver, 10).until(lambda driver :
driver.find_element_by_id(*"kw"))
element.send_keys("selenium")
#添加智能等待
driver.implicitly_wait(30)
driver.find_element_by_id("su").click()
#添加固定休眠时间
time.sleep(5)
driver.quit()
#coding=utf-8**
import time
#sleep()方法以秒为单位,假如休眠时间小时 1 秒,可以用小数表示。
time.sleep(5)
time.sleep(0.5)
#当然,也可以直接导入 sleep()方法,使脚本中的引用更简单
from time import sleep
sleep(3)
sleep(30)
mplicitly_wait()
implicitly_wait()方法比 sleep() 更加智能,后者只能选择一个固定的时间的等待,前者可以在一个时间
范围内智能的等待。
WebDriverWait()
详细格式如下:
WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)
driver - WebDriver 的驱动程序(Ie, Firefox, Chrome 或远程)
timeout - 最长超时时间,默认以秒为单位
poll_frequency - 休眠时间的间隔(步长)时间,默认为 0.5 秒
ignored_exceptions - 超时后的异常信息,默认情况下抛 NoSuchElementException 异常。
WebDriverWai()一般由 unit()或 until_not()方法配合使用,直到until为ture或者not until为false
from selenium.webdriver.support.ui import WebDriverWait
element = WebDriverWait(driver, 10).until(lambda x: x.find_element_by_id(“someId”))
is_disappeared = WebDriverWait(driver, 30, 1, (ElementNotVisibleException)).
until_not(lambda** x: x.find_element_by_id(“someId”).is_displayed())
#coding=utf-8*
from selenium import webdriver
import os
driver=webdriver.Firefox()
file_path='file:///'+os.path.abspath('1.html')
driver.get(file_path)
#选择页面上多有tagname为input的元素
inputs=driver.find_elements_by_tag_name('input')
for input in inputs:
if input.get_attribute('type')==*'checkbox':
input.click()
print "11"**
driver.quit()
os.path.abspath()
os 模块为 python 语言标准库中的 os 模块包含普遍的操作系统功能。主要用于操作本地目录文件。
path.abspath()方法用于获取当前路径下的文件。另外脚本中还使用到 for 循环,对 inputs 获取的一组元素
进行循环,在 python 语言中循环变量(input)可以不用事先声明直接使用
print len(driver.find_elements_by_css_selector('input[type=checkbox]'))
# 把页面上最后1个 checkbox 的勾给去掉
driver.find_elements_by_css_selector('input[type=checkbox]').pop().click()
pop 也为 python 语言中提供的方法,用于删除指定们位置的元素,pop()为空默认选择最一个元素。
#点击link1链接(弹出下拉列表)*
driver.find_element_by_link_text('Link1').click()
#在父亲元件下找到link为action的子元素
menu=driver.find_element_by_id(*'dropdown1').find_element_by_link_text('Another action')
#鼠标移动到子元素上面
ActionChains(driver).move_to_element(menu).perform()
driver.find_element_by_id('xx').find_element_by_link_text('xx').click()
这里用到了二次定位,通过对 Link1 的单击之后,出现下拉菜单,先定位到下拉菜单,再定位下拉菜单中的选项。当然,如果菜单选项需要单击,可通过二次定位后也直接跟 click()操作。
ActionChains(driver)
driver: wedriver 实例执行用户操作。
ActionChains 用于生成用户的行为;所有的行为都存储在 actionchains 对象。通过 perform()执行存储的行为。
move_to_element(menu)
move_to_element 方法模式鼠标移动到一个元素上,上面的例子中 menu 已经定义了他所指向的是哪一个元素。
perform() 执行所有 ActionChains 中存储的行为
#先找到到 ifrome1(id = f1)**
driver.switch_to_frame("f1")
#再找到其下面的 ifrome2(id =f2)
driver.switch_to_frame("f2"**)
switch_to_frame 的参数问题。官方说 name 是可以的,但是经过实验发现 id 也可以。所以只要 frame
中 id 和 name,那么处理起来是比较容易的。如果 frame 没有这两个属性的话,你可以直接手动添加
页面上弹出的对话框是自动化测试经常会
#点击登录链接
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("TANGRAMPSP_10submit").click()本例中并没有用到新方法,唯一的技巧是用到了二次定位,这个技巧在层级定位中已经有过使用。
driver.find_element_by_class_name("tang-content").find_element_by_name("userName")
第一次定位找到弹出的登录框,在登录框上再次进行定位找到了用户名输入框。
driver.set_window_size(480, 800)
# 后退 driver.back() # 前进 driver.forward()
driver.refresh() # 刷新
关闭浏览器
2
# 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()
在本例中所有用到的新方法:
current_window_handle
获得当前窗口句柄
window_handles
返回的所有窗口的句柄到当前会话
switch_to_window()
用于处理多窗口操作的方法,与我们前面学过的 switch_to_frame() 是类似,switch_to_window()用于
处理多窗口之前切换,switch_to_frame() 用于处理多框架的切换。
close()
如果你足够细心会发现我们在关闭“注册页”时用的是 close()方法,而非 quit();close()用于关闭当前
窗口,quit()用于退出驱动程序并关闭所有相关窗口。
webdriver 中处理 JavaScript 所生成的 alert、confirm 以及 prompt 是很简单的。具体思路是使用switch_to.alert()方法定位到 alert/confirm/prompt。然后使用 text/accept/dismiss/send_keys 按需进行操做。
l text 返回 alert/confirm/prompt 中的文字信息。
l accept 点击确认按钮。
l dismiss 点击取消按钮,如果有的话。
l send_keys 输入值,这个 alert\confirm 没有对话框就不能用了,不然会报错
#点击保存设置
driver.find_element_by_xpath("//div[@id='gxszButton']/input").click()
#接受警告信息
alert = driver.switch_to_alert()
alert.accept()
#得到文本信息并打印
alert = driver.switch_to_alert()
print alert.text()
#取消对话框(如果有的话)
alert = driver.switch_to_alert()
alert.dismiss()
#输入值(如果有的话)
alert = driver.switch_to_alert()
alert.send_keys(“xxx”)
from selenium import webdriver
from selenium.webdriver.support.select import Select
from time import sleep
driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.get('http://www.baidu.com')
sel = driver.find_element_by_xpath("//select[@id='nr']")
Select(sel).select_by_value('50') # 显示50条
#先定位到下拉框
m=driver.find_element_by_id(“ShippingMethod”)
#再点击下拉框下的选项
m.find_element_by_xpath("//option[@value=‘10.69’]").click()
需要说明的是在实际的 web 测试时,会发现各种类型的下拉框,并非我们我们上面所介绍的传统的下拉框。如图 3.x ,对这种类型的下拉框一般的处理是两次点击,第一点击弹出下拉框,第二次点击操作元素。当然,也有些下拉框是鼠标移上去直接弹出的,那么我们可以使用 move_to_element()进行操作。
#获取所有分页的数量,并打印
total_pages=len(driver.find_element_by_tag_name("select").find_elements_by_t
ag_name("option"))
print "total page is %s" %(total_pages)
sleep(3)
#再次获取所分页,并执行循环翻页操作
pages=driver.find_element_by_tag_name("select").find_elements_by_tag_name("option")
for page in pages:
page.click()
第十五节 上传文件
#打开上传文件页面
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')
browser.download.dir 用于指定你所下载文件的目录。
os.getcwd() 该函数不需要传递参数,用于返回当前的目录。
application/octet-stream 为内容的类型
webdriver 提供了 execute_script() 接口用来调用 js 代码。
如果你熟悉 JavaScript的话,那么使用 webdriver 执行 JavaScript 是一件非常高效的事情。
#######通过 JS 隐藏选中的元素##########第一种方法:
#隐藏文字信息
driver.execute_script(’$("#tooltip").fadeOut();’)
time.sleep(5)
#隐藏按钮:
button = driver.find_element_by_class_name(‘btn’)
driver.execute_script(’$(arguments[0]).fadeOut()’,button)
execute_script(script, *args)
在当前窗口/框架 同步执行 javaScript
script:JavaScript 的执行。
*args:适用任何 JavaScript 脚本。
#将页面滚动条拖到底部
js=“var q=document.documentElement.scrollTop=10000”
driver.execute_script(js)
time.sleep(3)
#将滚动条移动到页面的顶部
js_=“var q=document.documentElement.scrollTop=0”
driver.execute_script(js_)
WebDriver操作cookie的方法:
直接用cookie登录方法
链接:https://www.jianshu.com/p/773c58406bdb
for item in cookies:
driver.add_cookie(item)
对cookie操作:
#向 cookie 的 name 和 value 添加会话信息。
driver.add_cookie({‘name’:‘key-aaaaaaa’, ‘value’:‘value-bbbb’})
#遍历 cookies 中的 name 和 value 信息打印,当然还有上面添加的信息
for cookie in driver.get_cookies():
print “%s -> %s” % (cookie[‘name’], cookie[‘value’])
driver.delete_cookie(“CookieName”)
driver.delete_all_cookies()
input.get_attribute(‘data-node’) == ‘594434493’:
1去掉验证码2设置万能码3验证码识别技术:Python-tesseract 是光学字符识别 Tesseract OCR 引擎的 Python 封装类。能够读取任何常规的图片文件(JPG, GIF ,PNG , TIFF 等)。不过,目前市面上的验证码形式繁多,目前任何一种验证码识别技术,识别率都不是 100% 。
4记录 cookie
通过向浏览器中添加 cookie 可以绕过登录的验证码,这是比较有意思的一种解决方案。我们可以在用户登录之前,通过 add_cookie()方法将用户名密码写入浏览器 cookie ,再次访问系统登录链接将自动登录。例如下面的方式:
#访问 xxxx 网站
driver.get(“http://www.xxxx.cn/”)
#将用户名密码写入浏览器 cookie
driver.add_cookie({‘name’:‘Login_UserNumber’, ‘value’:‘username’})
driver.add_cookie({‘name’:‘Login_Passwd’, ‘value’:‘password’})
#再次访问 xxxx 网站,将会自动登录
driver.get(“http://www.xxxx.cn/”)
time.sleep(3)
使用 cookie 进行登录最大的难点是如何获得用户名密码的 name ,如果找到不到 name 的名字,就没办法向 value 中输用户名、密码信息。笔者的建议是可以通过 get_cookies()方法来获取登录的所有的 cookie 信息,从而进行找到用户名、密码的 name 对象的名字;当然,最简单的方法还是询问前端开发人员。
\1. WebDriver 启动目标浏览器,并绑定到指定端口。该启动的浏览器实例,做为 web driver 的 remote server。
\2. Client 端通过 CommandExcuter 发送 HTTPRequest 给 remote server 的侦听端口(通信协议: the webriver wire protocol)
\3. Remote server 需要依赖原生的浏览器组件(如:IEDriverServer.exe、chromedriver.exe),来转化转化浏览器的 native 调用。
总结:
通过本章的学习,我们比较全面的掌握了如何使用 webdriver 所提供的方法对页面上各种元素进行操作。不过在实际的自动化测试过程中,读者会遇到各种各样的问题,笔者建议读者从以下几个方面进行提高:
1、熟练掌握 xpath\CSS 定位的使用,这样在遇到各种难以定位的属性时才不会变得束手策。
2、准备一份 python 版本的 webdriver API ,遇到不理解地方,及时查到 API 的使用
3、学习掌握 JavaScript 语言,掌握 JavaScript 好处前面已经有过阐述,可以让我们的自动化测试工作更加游刃有余。
4、自动化测试归根结底是与前端打交道,多多熟悉前端技术,如 http 请求,HTML 语言 ,cookie/session 机制等。
在element变成elements就是找所有满足的条件,返回数组。
driver.find_element_by_id("kw").clear() # 清楚文本 driver.find_element_by_id("kw").send_keys("selenium") # 模拟按键输入 driver.find_element_by_id("su").click() # 单机元素
可以在搜索框模拟回车操作
search_text = driver.find_element_by_id('kw') search_text.send_keys('selenium') search_text.submit()
size: 返回元素的尺寸。
text: 获取元素的文本。
get_attribute(name): 获得属性值。
is_displayed(): 设置该元素是否用户可见。
title = driver.title # 打印当前页面title
now_url = driver.current_url # 打印当前页面URL
user = driver.find_element_by_class_name('nums').text # # 获取结果数目
driver.switch_to_window("windowName")
driver.switch_to_frame("frameName")
以直接取表单的id 或name属性。如果iframe没有可用的id和name属性,则可以通过下面的方式进行定位。
#先通过xpth定位到iframe
xf = driver.find_element_by_xpath('//*[@id="x-URS-iframe"]')
#再将定位对象传给switch_to_frame()方法
driver.switch_to_frame(xf)
一旦我们完成了frame中的工作,我们可以这样返回父frame:
driver.switch_to_default_content()
alert = driver.switch_to_alert()
driver.find_element_by_name("file").send_keys('D:\\upload_file.txt') # # 定位上传按钮,添加本地文件
js="window.scrollTo(100,450);"
driver.execute_script(js) # 通过javascript设置浏览器窗口的滚动条位置
通过execute_script()方法执行JavaScripts代码来移动滚动条的位置。
driver.get_screenshot_as_file("D:\\baidu_img.jpg") # 截取当前窗口,并指定截图图片的保存位置
把重复的部分写成一个公共的模块,需要的时候进行调用,
login.py
#登录模块
def login():
driver.find_element_by_id(“tbUserName”).send_keys(“username”)
driver.find_element_by_id(“tbPassword”).send_keys(“456123”)
driver.find_element_by_id(“btnLogin”).click()
调用login.login()
第一节、 登录模块化
第三节、数据驱动(参数化)
source=open(“D:abc**data.txt”,“r”)
values=source.readlines(); // un = source.read() #读取用户名
source.close()
for a invalues:
driver.find_element_by_id(“kw”).send_keys(a)
通过 python 文档我们发现 python
读取文件的方式有:整个文件读取、逐行读取、固定字节读取。并没有找到一次读取两条数据的好方法
q.py
def fun(un=‘testing’, pw=123456):
print “success reader username and password!!”*
import q # 导入函数**
创建字典用大括号,数据由 key/value 键值对组成,keys()方法返回字典中的键列表。values()返回字典中的值列表,items()返回(key,value)元组
CSV 读取文件比较灵活,可以循环读取每一条数据,从而又不局限每次所读取数据的个数。
抛出异常
#coding=utf-8**
filename=raw_input(“please input a valueL:”)
if filename==“hello”:
raise NameError(‘indfput file name error’**)
browser.get_screenshot_as_file(“F:/Projects/python/516/error_png.png”)
在脚本无法继续执行时候, get_screenshot_as_file()函数将截取当前页面的截图保存到指定的位置,这是一个非常棒的功能
简略版参考:https://zhuanlan.zhihu.com/p/111859925