1、webdriver的工作原理简述:
- 启动浏览器后,selenium-webdriver会将目标浏览器绑定到特定的端口,启动后的浏览器则作为webdriver的 remote server。
- 客户端(测试脚本),借助ComandExecutor发送HTTP请求给sever端(通信协议是The WebDriver Wire Protocol,在HTTP request的body中,会以WebDriver Wire协议规定的JSON格式的字符串来告诉Selenium希望对浏览器的操作)。
- Sever端需要依赖原生的浏览器组件,转化Web Service的命令为浏览器native的调用来完成操作。
2、webdriver常用的API
(1)简单的脚本示例(解/注释快捷键:Crtl+/)
coding=utf-8 # 防止乱码 可不加
from selenium import webdriver # 导入包后才可使用selenium中webdriver里的函数
import time # 为视觉效果以及给页面加载留时间 后续需要用到时间函数 所以导入相应的包
driver=webdriver.Chrome() # 需要操控的浏览器是Chorme 注意首字母大写
driver.get("https://www.baidu.com/") # 在浏览器上打开百度
# 根据页面输入框的控件属性(这里是id) 输入thoughtworks
driver.find_element_by_id("kw").send_keys("thoughworks")
driver.find_element_by_id("su").click() # 输入结束后 根据按钮的控件属性(id)点击查找
time.sleep(8) #停留八秒 视觉效果
driver.quit() # 退出并关闭窗口的每一个相关的驱动程序 彻底退出 释放连接
# driver.close() # 关闭当前窗口
(2)元素定位
- 对象的定位是自动化测试的核心。操作一个对象前,应先识别该对象。
- 对象具有自己的属性,我们可以通过这个属性找到这对象。尤其需要保证页面上对象的属性的唯一性。比如通过名字无法精准找到一个人,但通过身份证号可以。
- webdriver 常用的几种对象定位方法有:id、name、class name、link text、partial link text、 tag name、 xpath、css selector。其中id、xpath、css selector这三者均可唯一定位到元素。
- 示例
from selenium import webdriver
import time
driver=webdriver.Chrome()
driver.get("https://www.baidu.com/")
# id定位
driver.find_element_by_id("kw").send_keys("西安")
# name定位
driver.find_element_by_name("wd").send_keys("西安")
# class name定位
driver.find_element_by_class_name("s_ipt").send_keys("西安")
# tag name定位 不会成功 因为input不唯一
driver.find_element_by_tag_name("input").send_keys("西安")
# xpath定位
driver.find_element_by_xpath("//*[@id='kw']").send_keys("西安")
# CSS定位
driver.find_element_by_css_selector("#kw").send_keys("西安")
driver.find_element_by_id("su").click()
time.sleep(8)
driver.quit()
一个热知识:xpath可以用Chrome的F12开发者模式中Element-右键-copy-copy xpath来获取。
(3)操作测试对象
定位元素后即可对其进行操作,webdriver 中比较常用的操作对象的方法如下:
- click:点击对象
- send_keys:在对象上模拟按键输入
- clear:清除对象的内容
- submit:提交表单
- text:获取元素的文本信息
示例:
from selenium import webdriver
import time
driver=webdriver.Chrome()
# 浏览器最大化
driver.maximize_window()
time.sleep(2)
driver.get("https://www.baidu.com/")
#
# # 操作浏览器的前进、后退
# first_url="https://www.baidu.com/" # 访问百度首页
# driver.get(first_url)
# time.sleep(3)
#
# second_url="https://news.baidu.com/" # 访问新闻页面
# driver.get(second_url)
# time.sleep(3)
#
# driver.back() # 后退到百度首页
# time.sleep(2)
#
# driver.forward() # 前进到新闻页
# 设置浏览器宽、高
# driver.set_window_size(2000, 1000)
# time.sleep(4)
# 打印url
# url=driver.current_url
# print(url)
driver.find_element_by_id("kw").send_keys("西安")
driver.find_element_by_id("su").click()
time.sleep(4)
# # 控制浏览器滚动条
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)
time.sleep(3) # 滚动条拖到顶部
# driver.find_element_by_id("kw").clear()
# time.sleep(2)
# driver.find_element_by_id("kw").send_keys("十四届全运会")
# driver.find_element_by_id("su").submit()
# 获得文本信息
# text=driver.find_element_by_id("bottom_layer").text
# print(text)
# 固定等待和智能等待
# driver.find_element_by_id("kw").send_keys("西安")
# driver.find_element_by_id("su").submit()
# time.sleep(4) 固定等待 保证以上页面加载完后再进入下面的链接
# 智能等待 加载完毕后立即进入
# driver.implicitly_wait(10)
# driver.find_element_by_link_text("西安(陕西省辖地级市、省会) - 百度百科").click()
# 在打印title时 如果没有这句 则在未完全加载的情况下 会打印 百度一下 你就知道
# time.sleep(6)
# 打印title
# title=driver.title
# print(title)
# 打印url
# url2=driver.current_url
# print(url2)
driver.quit()
|