码迷,mamicode.com
首页 > Windows程序 > 详细

WebDriver API

时间:2020-05-12 16:56:30      阅读:95      评论:0      收藏:0      [点我收藏+]

标签:定位   初心   标签   always   dismiss   key   双击   path   RoCE   

WebDriver 属于selenium体系中设计出来操作浏览器的一套API。

在webdriver角度上,因他针对多种编程语言都实现了一遍这套API,所以他可以支持多种编程语言;在编程语言的角度,webdriver是python的一个用于实现web自动化的第三方库

 

一、WebDriver 原理

webdriver是按照server-client的设计模式设计的:

  server端就是remote server,可以是任意浏览器。当脚本启动浏览器后,浏览器就是remote server,他的职责就是等待client发送请求并做出响应。

  client是我们的测试代码了,代码中的一些行为(打开浏览器、跳转URL等)操作是以http请求的方式发送给被测试浏览器的(remote server)。remote server接受请求,执行相应操作并在response中返回执行状态、返回值等

webdriver 工作流程:

  1.webdriver启动浏览器,并绑定到指定的端口。启动浏览器实例将作为webdriver的remote server

  2.client端通过commandexcuter 发送httprequest给remote server的侦听端口(通信协议:the webriver wire protocol)

  3.remote server需要依赖原声的浏览器组件(如IEDriverServer.exe、chromedriver.exe)来转化浏览器的native调用

 

python提供了logging模块给运行中的应用提供了一个标准的信息输出接口:

from selenium import webdriver
import logging

logging.basicConfig(level=logging.DEBUG) #此模式能捕获到客户端向服务端发送的post请求
diver = webdriver.Ie()
diver.get("http://www.baidu.com")

diver.find_element_by_id("kw").send_keys("selenium")
diver.find_element_by_id("su").click()
diver.quit()


C:\Users\xiu\AppData\Local\Programs\Python\Python36-32\python.exe D:/study/besttest/XIU/logs/debug11.py
DEBUG:selenium.webdriver.remote.remote_connection:POST http://127.0.0.1:51379/session {"capabilities": {"firstMatch": [{}], "alwaysMatch": {"browserName": "internet explorer"}}, "desiredCapabilities": {"browserName": "internet explorer", "version": "", "platform": "WINDOWS"}}
DEBUG:selenium.webdriver.remote.remote_connection:Finished Request
DEBUG:selenium.webdriver.remote.remote_connection:POST http://127.0.0.1:51379/session/b13cead7-a113-4840-8a19-14b58ae3aaaf/url {"url": "http://www.baidu.com", "sessionId": "b13cead7-a113-4840-8a19-14b58ae3aaaf"}
DEBUG:selenium.webdriver.remote.remote_connection:Finished Request
DEBUG:selenium.webdriver.remote.remote_connection:POST http://127.0.0.1:51379/session/b13cead7-a113-4840-8a19-14b58ae3aaaf/element {"using": "id", "value": "kw", "sessionId": "b13cead7-a113-4840-8a19-14b58ae3aaaf"}
DEBUG:selenium.webdriver.remote.remote_connection:Finished Request
DEBUG:selenium.webdriver.remote.remote_connection:POST http://127.0.0.1:51379/session/b13cead7-a113-4840-8a19-14b58ae3aaaf/element/416ba0b6-a972-45c7-a25e-d37dfe5729c5/value {"text": "selenium", "value": ["s", "e", "l", "e", "n", "i", "u", "m"], "id": "416ba0b6-a972-45c7-a25e-d37dfe5729c5", "sessionId": "b13cead7-a113-4840-8a19-14b58ae3aaaf"}
DEBUG:selenium.webdriver.remote.remote_connection:Finished Request
DEBUG:selenium.webdriver.remote.remote_connection:POST http://127.0.0.1:51379/session/b13cead7-a113-4840-8a19-14b58ae3aaaf/element {"using": "id", "value": "su", "sessionId": "b13cead7-a113-4840-8a19-14b58ae3aaaf"}
DEBUG:selenium.webdriver.remote.remote_connection:Finished Request
DEBUG:selenium.webdriver.remote.remote_connection:POST http://127.0.0.1:51379/session/b13cead7-a113-4840-8a19-14b58ae3aaaf/element/5d135cb0-7222-4978-9d52-2950eca2b63e/click {"id": "5d135cb0-7222-4978-9d52-2950eca2b63e", "sessionId": "b13cead7-a113-4840-8a19-14b58ae3aaaf"}
DEBUG:selenium.webdriver.remote.remote_connection:Finished Request
DEBUG:selenium.webdriver.remote.remote_connection:DELETE http://127.0.0.1:51379/session/b13cead7-a113-4840-8a19-14b58ae3aaaf {"sessionId": "b13cead7-a113-4840-8a19-14b58ae3aaaf"}
DEBUG:selenium.webdriver.remote.remote_connection:Finished Request

Process finished with exit code 0

二、元素定位(id、name、class、tag、link、partial link、Xpath、CSS、By九种方法定位元素)

 

from selenium import webdriver
driver = webdriver.Ie()
driver.get(‘http://www.baidu.com‘)
# driver.find_element_by_id(‘kw‘).send_keys(‘selenium 自动化测试‘) #id定位
# driver.find_element_by_name(‘wd‘).clear() #name定位
# driver.find_element_by_class_name(‘s_ipt‘).send_keys(‘selenium‘) #class定位
# driver.find_element_by_tag_name(‘input‘).clear() #--tag定位。一个界面可能会有很多相同的tag,因此此定位方法识别某个元素的概率很低,一般不单独用
# driver.find_element_by_link_text(‘新闻‘).click() #link定位
# driver.find_element_by_partial_link_text(‘《不忘初心 继续前进》‘).click() #对link定位的一个补充,支持通过元素标签之间的部分文本信息来定位
#xpath定位
# driver.find_element_by_xpath(‘/html/body/div[2]/div/div/div/div/form/span[1]/input‘).clear() #绝对路径
# driver.find_element_by_xpath("//*[@id=‘kw‘]").send_keys(‘seleium2‘) #元素属性定位
# driver.find_element_by_xpath("//*[@name=‘wd‘]").clear() #元素属性定位
# driver.find_element_by_xpath("//*[@class=‘s_ipt‘]").send_keys(‘seleium3‘) #元素属性定位
#层级与属性结合
# driver.find_element_by_xpath("//form[@id=‘form‘]/span[1]/input").clear() #通过父元素进行定位
#使用逻辑运算符
# driver.find_element_by_xpath("//input[@id=‘kw‘ and @class=‘s_ipt‘]").send_keys(‘seleium4‘)

#CSS定位
# driver.find_element_by_css_selector(‘.s_ipt‘).send_keys(‘css定位-class‘) #通过class属性定位
# driver.find_element_by_css_selector(‘#kw‘).send_keys(‘css定位-id‘) #通过id属性定位
# driver.find_element_by_css_selector(‘input‘) #通过标签定位
# driver.find_element_by_css_selector(‘form>span>input‘).click() #通过父子关系定位
# driver.find_element_by_css_selector(‘form>span>input.s_ipt‘).click() #组合定位
# driver.find_element_by_css_selector(‘form>span>input#kw‘).click() #组合定位
# driver.find_element_by_css_selector(‘form.fm>span>input#su‘).click() #组合定位

from selenium.webdriver.common.by import By
#用by元素定位
# driver.find_element(By.ID,"kw").send_keys(‘By元素定位-id‘)
# driver.find_element(By.ID,"kw").clear()
# driver.find_element(By.NAME,"wd").send_keys(‘By元素定位-name‘)
# driver.find_element(By.NAME,"wd").clear()
# driver.find_element(By.CLASS_NAME,"s_ipt").send_keys(‘By元素定位-class-name‘)
# driver.find_element(By.CLASS_NAME,"s_ipt").clear()
# driver.find_element(By.TAG_NAME,"input").send_keys("By元素定位-input")
# driver.find_element(By.TAG_NAME,"input").clear()
# driver.find_element(By.LINK_TEXT,"新闻").click()
# driver.find_element(By.PARTIAL_LINK_TEXT,"新").click()
# driver.find_element(By.XPATH,"//*[@class=‘bg s_btn‘]").click()

 

三、控制浏览器

 import time

 

#控制浏览器大小(设置浏览器宽800,高600)
# driver.set_window_size(800,600)
#控制浏览器后退、前进
# driver.find_element_by_link_text(‘新闻‘).click()
# driver.back() #后退
# driver.forward() #前进
#模拟浏览器刷新
# driver.find_element_by_id("kw").send_keys("selenium")
# driver.find_element_by_id("su").click()
# time.sleep(2)
# driver.refresh()
# driver.quit()

 

四、简单元素操作

 

from selenium import webdriver
import time
driver = webdriver.Ie()
# driver.get(‘https://login.xiu.com/‘)

#clear() 清除文本
#send_keys() 模拟按键输入
#click() 单击元素
#模拟走秀网登录
# driver.find_element_by_link_text("密码登录").click()
# driver.find_element_by_id("J_username").clear()
# driver.find_element_by_id("J_username").send_keys("13684995613")
# driver.find_element_by_id("J_password").clear()
# driver.find_element_by_id("J_password").send_keys("jmy@123")
# driver.find_element_by_id("login_Btn").click()
# driver.quit()

#webelement接口常用方法

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

# driver.find_element_by_id("kw").send_keys("webelement接口常用方法")
# driver.find_element_by_id("kw").submit() #用于提交表单
# print(driver.find_element_by_id("kw").size) #获得输入框尺寸({‘height‘: 22, ‘width‘: 500})
# print(driver.find_element_by_id("cp").text) #获得text值(©2017 Baidu 使用百度前必读 意见反馈 京ICP证030173号 京公网安备11000002000001号 )
# print(driver.find_element_by_id("kw").get_attribute(‘type‘)) #获得元素的属性(text):id/name/type或其他任意属性
# print(driver.find_element_by_id("kw").is_displayed()) #返回元素是否可见(True)

 

五、鼠标事件

 

#ActionChains类提供了一些鼠标操作的方法(右击、双击、悬浮、鼠标拖动等)
# import time
# from selenium import webdriver
# from selenium.webdriver.common.action_chains import ActionChains
# driver = webdriver.Ie()
# driver.get("http://www.baidu.com")
#鼠标右击操作
# right_click = driver.find_element_by_link_text("新闻") #定位到要执行的元素
# ActionChains(driver).context_click(right_click).perform() #执行右击操作(ActionChains()将浏览器驱动driver作为参数传入;context_click()方法用于模拟鼠标右键操作;perform()执行所有ActionChains中存储的行为)

# 鼠标悬浮
# above = driver.find_element_by_link_text("设置")
# ActionChains(driver).move_to_element(above).perform()
# time.sleep(2)
# driver.quit()

#鼠标双击操作
# double_click = driver.find_element_by_id("su")
# ActionChains(driver).double_click(double_click).perform()
# driver.quit()

#拖放鼠标
# element = driver.find_element_by_id("xx")
# target = driver.find_element_by_id("xx")
# ActionChains(driver).drag_and_drop(element,target).perform() #在element元素上按住鼠标左键,然后移动到target元素上释放

 

六、键盘事件

 

#Keys()类提供了键盘上几乎所有的按键方法。
# import time
# from selenium import webdriver
# from selenium.webdriver.common.keys import Keys
# driver = webdriver.Ie()
# driver.get("http://www.baidu.com")

#输入框输入内容
# driver.find_element_by_id("kw").send_keys("selenium")
#删除一个字母
# driver.find_element_by_id("kw").send_keys(Keys.BACK_SPACE)
#输入含空格键
# driver.find_element_by_id("kw").send_keys(Keys.SPACE)
# driver.find_element_by_id("kw").send_keys("好孩子")
#全选输入框内容
# driver.find_element_by_id("kw").send_keys(Keys.CONTROL,‘a‘)
#剪切输入框内容
# driver.find_element_by_id("kw").send_keys(Keys.CONTROL,‘x‘)
#粘贴内容到输入框
# driver.find_element_by_id("kw").send_keys(Keys.CONTROL,‘v‘)
#通过键盘代替单击操作
# driver.find_element_by_id("su").send_keys(Keys.ENTER)
#F12键
# driver.find_element_by_id("kw").send_keys(Keys.F12)
# time.sleep(2)
# driver.quit()

 

七、获得验证码信息

 

# from selenium import webdriver
# import time
# driver = webdriver.Ie()
# driver.get("https://login.xiu.com/")
# driver.find_element_by_link_text("密码登录").click()
# time.sleep(2)
# driver.refresh() #运维把登录页限速了,因此这里等待刷新下
# time.sleep(2)
# driver.find_element_by_id("J_username").clear()
# driver.find_element_by_id("J_username").send_keys("13684995613")
# driver.find_element_by_id("J_password").clear()
# driver.find_element_by_id("J_password").send_keys("jmy@123")
# driver.find_element_by_id("login_Btn").click()
# name = driver.find_element_by_xpath(".//*[@id=‘logindiv‘]/a[1]").text
# if name == ‘大熊二‘:
# print("登录成功")
# else:
# print("登录错误")
# driver.quit()

 

八、设置元素等待

 

# webdriver提供了两种类型的等待:显示等待和隐式等待
# 1.显示等待:某个条件成立时继续执行,否则在达到最大时长时抛弃超时异常(TimeoutException)


#2.隐式等待:通过一定的时长等待页面上某元素加载完成。如超出了设置的时长元素还未加载,则抛出NoSuchElementException异常
# from selenium import webdriver
# from selenium.common.exceptions import NoSuchElementException
# from time import ctime

# driver = webdriver.Ie()
#设置隐式等待为10S
# driver.implicitly_wait(10)
# driver.get("http://www.baidu.com")
# try:
# print(ctime())
# driver.find_element_by_id("kw111").send_keys("selenium")
# except NoSuchElementException as e:
# print(e)
# finally:
# print(ctime())
# driver.quit()

 

九、定位一组元素

 

# from selenium import webdriver
# driver = webdriver.Ie()
# driver.get("http://www.baidu.com")
# driver.find_elements_by_id()
# driver.find_elements_by_name()
# driver.find_elements_by_class_name()
# driver.find_elements_by_tag_name()
# driver.find_elements_by_link_text()
# driver.find_elements_by_partial_link_text()
# driver.find_elements_by_xpath()
# driver.find_elements_by_css_selector()
#如果只想勾选一组元素中的某一个则用pop().lick():
# pop() 或pop(-1) 默认获取一组元素中的最后一个
# pop(0) 默认获取一组元素中的第一个
# pop(1) 默认获取一组元素中的第二个

 

十、多表单切换

 

#webdriver只能在一个页面上对元素识别和定位,对于frame/iframe表单内嵌页面上的元素无法直接定位。
这时就需要通过switch_to.frame()方法将当前定位的主题切换为frame/iframe表单的内嵌页面中
switch_to.frame()默认可以直接取表单的id或name。如果iframe没有可用的id和name属性,则可以通过xpath先定位表单,然后再传给switch_to.frame()

from selenium import webdriver
import time
import os

driver = webdriver.Ie()
file_path = ‘file:///‘ + os.path.abspath(‘a.html‘) #自己写了一个表单内嵌的HTML
driver.get(file_path)
#切换到iframe(id= "if")的表单
driver.switch_to.frame("if")
driver.find_element_by_id("kw").send_keys("selenium")
driver.find_element_by_id("su").click()
time.sleep(2)
driver.quit()

 

十一、多窗口切换

 

#webdriver提供了switch_to_window()的方法,实现在不同的窗口之间切换
from selenium import webdriver
import time
driver = webdriver.Ie()
driver.implicitly_wait(10)
driver.get("http://www.baidu.com")

sreach_window = driver.current_window_handle
driver.find_element_by_link_text("登录").click()
driver.find_element_by_link_text("立即注册").click()


all_handls = driver.window_handles

for handle in all_handls:
if handle != sreach_window:
driver.switch_to_window(handle)
print(‘now sreach window!‘)
driver.find_element_by_id("TANGRAM__PSP_3__userName").send_keys("username")
driver.find_element_by_id("TANGRAM__PSP_3__phone").send_keys("13684995613")
time.sleep(2)

for handle in all_handls:
if handle == sreach_window:
driver.switch_to_window(handle)
print(‘now sreach window!‘)
driver.find_element_by_id("TANGRAM__PSP_4__closeBtn").click()
driver.find_element_by_id("kw").send_keys("selenium")
driver.find_element_by_id("su").click()
time.sleep(2)
driver.quit()

 

十二、警告框处理

 

#在webdriver中处理JavaScript所生成的alert、confirm、prompt,使用switch_to_alert()方法定位到alert/confirm/prompt,然后用text/accept/dismiss/send_keys等方法进行操作
#text: 返回alert/confirm/prompt中的文字信息
#accept() 接受现有警告框
#dismiss() 解散现有警告框
#send_keys(keysToSend):发送文本至警告框
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
import time

driver = webdriver.Ie()
driver.implicitly_wait(10)
driver.get("http://www.baidu.com")

link = driver.find_element_by_link_text("设置")
ActionChains(driver).move_to_element(link).perform()

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

driver.find_element_by_class_name("prefpanelgo").click()
time.sleep(2)

driver.switch_to_alert().accept()
driver.quit()

 

十三、上传文件

 

#对于web页面的上传功能实现一般有以下两种方式:
# 1.普通上传:普通的附件上传是将本地文件的路径作为一个值放在input标签中,通过form表单将这个值提交给服务器
# 2.插件上传:一般是基于flash、JavaScript、ajax等技术所实现的上传功能

# 1.send_keys实现上传

from selenium import webdriver
import os

driver = webdriver.Ie()
file_path = ‘file:///‘ + os.path.abspath(‘b.html‘) #自己写的一个上传的HTML
driver.get(file_path)

driver.find_element_by_name("file").send_keys("D:\\upload_file.txt")
driver.quit()

# 2.通过Autolt实现(略)

十四、下载文件

 

from selenium import webdriver
import os
driver = webdriver.FirefoxProfile()
driver.set_preference("browser.download.folderList",2) #设置为0下载到浏览器默认下载目录,设置2可以保存到指定目录
driver.set_preference("browser.download.manager.showWhenStarting",False) #True为显示, False不显示
driver.set_preference("browser.download.dir",os.getcwd()) #os.getcwd()用户返回当前目录
driver.set_preference("browser.helperApps.neverAsk.saveToDisk","application/octet-stream") #指定要下载页面的content-type值:application/octet-stream

driver1 = webdriver.Firefox(firefox_profile=driver)
driver1.get("http://pypi.python.org/pypi/selenium")
driver1.find_element_by_partial_link_text("selenium-3.6.0.tar.gz").click()
driver1.quit()

 

十五、操作cookie

 

#webdriver操作cookie的方法(cookie数据是以字典的形式存放的):
# get_cookies(): 获得所有cookie信息
# get_cookies(name): 返回字典的key为name的cookie信息
# add_cookie(cookie_dict): 添加cookie。“cookie_dict”指字典对象,必须有name和value值
# delete_cookie(name,optionsString):删除cookie信息,“name”是要删除的cookie的名称,optionsString是该cookie的选项
# delete_all_cookies(): 删除所有cookie信息

from selenium import webdriver
import time
driver = webdriver.Firefox()
driver.get("http://www.youdao.com")
time.sleep(3)
driver.add_cookie({"name":"key-aaaaaaa",‘value‘:‘value-aaaaaaa‘})
# time.sleep(3)
for cookie in driver.get_cookies():
print("%s -> %s" % (cookie[‘name‘],cookie[‘value‘]))

driver.quit()

 

十六、调用JavaScript

 

#调用JavaScript控制浏览器滚动条

from selenium import webdriver
import time
driver = webdriver.Firefox()
driver.get("http://www.baidu.com")
driver.set_window_size(600,600)

driver.find_element_by_id("kw").send_keys("selenium")
driver.find_element_by_id("su").click()
time.sleep(2)

#设置滚动条滚动的位置
js = "window.scrollTo(600,450);"
driver.execute_script(js)
time.sleep(2)
driver.quit()

 

十七、窗口截图

 

#脚本执行过程中出错时候截图保存

from selenium import webdriver
import time
driver = webdriver.Firefox()
driver.get("http://www.baidu.com")

driver.find_element_by_id("kw").send_keys("selenium")
driver.find_element_by_id("su").click()
time.sleep(3)
#截取当前窗口,并指定截图图片的保存位置
driver.get_screenshot_as_file("D:\\picture\\baidu_img.jpg")
driver.quit()

十八、验证码处理

 

# 1.去掉 验证码
# 2.设置万能验证码
# 3.验证码识别技术
# 4.记录cookie(通过添加cookie的方式将用户名和密码写入cookie,这样的话再次访问的时候就可以直接登录了)

WebDriver API

标签:定位   初心   标签   always   dismiss   key   双击   path   RoCE   

原文地址:https://www.cnblogs.com/wsy0202/p/12876979.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!