Selenium2自动化测试的元素定位
Web页面有输入框,按钮,文字,图片,下拉框等,自动化要做的就是模拟鼠标和键盘来操作(单击,右击,双击,输入,或悬停)
Web页面元素属性有id,name,class name,tag name,XPath,CSS
Webdriver元素定位方法 | |
id | find_element_by_id() |
name | find_element_by_name() |
class name | find_element_by_class_name() |
tag name | find_element_by_tag_name() |
link text | find_element_by_link_text() |
partial link text | find_element_by_partial_link_text() |
xpath | find_element_by_xpath() |
css selector | find_element_by_css_selector() |
例如:find_element_by_tag_name(“input”),前端页面上<div>,<input>,<a>等tag,所以很难通过tag name区分不同的元素。
针对文本链接定位:find_element_by_link_text(“text”)是通过元素标签对之间的文本信息来定位元素。
一.XPath定位
1.决定路径定位: xpath主要用标签名的层级关系来定位元素的绝对路径;
2.利用元素属性定位:如find_element_by_xpath(“//input[@id=’kw’]”)
不想指定标签名时,则可以用*代替,如find_element_by_xpath(“//*[@id=’kw’]”)
Xpath不局限于id,name,class这些属性,元素的任意属性值都可以,只要它唯一的标识一个元素;
3.利用层级和属性的结合:如find_element_by_xpath(“//form[@id=’form’]/span/input”)
4.使用逻辑运算符:如
find_element_by_xpath(“//input[@id=’form’ and @class=’su’]”)
二.CSS定位
CSS选择器的常见语法 | ||
选择器 | 例子 | 描述 |
.class | .s_ipt | class选择器,选择class=”.s_ipt”的所有元素 |
#id | #firstname | id选择器,选择id=”firstname”的所有元素 |
* | * | 选择所有元素 |
element | p | 元素 所有的<p>元素 |
element>element | div>input | 选择父元素为<dir>的所有<input>元素 |
element+element | div+input | 选择同一级中紧接在<div>元素之后的所有<input>元素 |
[attribute=value] | [target=_blank] | 选择target=”_blank”的所有元素 |
1)通过class定位:find_element_by_css_selector(”.s_ipt”) 点号(.)表示通过class属性来定位元素;
2)通过id定位:find_element_by_css_selector(”#kw”) #表示通过id属性来定位元素;
3)通过标签名定位:
1.直接通过标签名定位:find_element_by_css_selector(”input”)
2.通过父子关系定位:find_element_by_css_selector(”span>input”)
4)通过属性定位
三.控制浏览器
1.控制浏览器窗口大小:set_window_size()
2.全屏显示:maximize_window()
3.控制浏览器的前进和后退:forward()和back()
4.浏览器的刷新:refresh()
四.简单元素操作
1.clear():清除文本;
2.send.keys(*value):模拟键盘输入
3.click():单击元素
Click()方法不仅可以用于单击一个按钮,还可以单击图片/文字链接,复选框,单选框,下拉框等;
4.submit()用于提交表单,或者在搜索框输入关键字后的”回车”操作,也可以通过submit()方法模拟;
5.size:返回元素的尺寸;
6.text:获取元素的文本;
7.get_attribute(name):获取属性值;
8.is_displayed():设置该元素是否用户可见;
9.close():关闭当前窗口
10.quit():推出相关的驱动程序并关闭所有的窗口;
通过By定位元素:from selenium.webdriver.common.by import By
五.鼠标事件
ActionChains()类提供鼠标操作的常用方法:
Perform():执行所有的ActionChains中存储的行为;
context_click():右击
double_click():双击
drag_and _drop():拖动
move_to_element():鼠标悬停
举例:
from selenium.webdriver.common.action_chains import ActionChains
#导入提供鼠标操作的ActionChains类。
right_click=find_element_by_id(“xx”)
ActionChains(driver).context_click(right_click).perform()
#调用ActionChains(driver)类,将浏览器驱动driver作为参数传入,context_click()方法用于模拟鼠标右键操作,在调用时需要指定元素定位;
source=driver.find_element_by_id(“xx”)
target=driver.find_element_by_id(“xx”)
ActionChains(driver).drag_and_drop(source,target).perform()
六.键盘事件
Keys()类提供了键盘上几乎所有按键的方法
send_keys()用来模拟键盘输入;
from selenium.webdriver.common.keys import Keys
send_keys(Keys.BACK_SPACE):删除键
send_keys(Keys.SPACE):空格键
send_keys(Keys.TAB):制表键
send_keys(Keys.ESCAPE):回退键
send_keys(Keys.ENTER):回车键
send_keys(Keys.CONTROL,’a’):全选
send_keys(Keys.CONTROL,’c’):复制
send_keys(Keys.CONTROL,’v’):粘贴
send_keys(Keys.CONTROL,’x’):剪切
send_keys(Keys.F1):F1
七.验证信息
常用的验证信息有title/URL/text;
driver.title/driver.current_url/
八.设置等待元素
显式等待:使WebdDriver等待某个条件成立时继续执行,否则达到最大你等待时长时抛出超时异常(TimeoutException);
隐式等待:通过一定的时长等待页面上某元素加载完成,如果超出了设置的时长仍旧没有加载完成,则抛出NoSuchElementException异常;
Driver.implicitly_wait()默认设置为0;首先它不是一个固定的等待时间,不影响脚本的执行速度,也不针对页面上的某一元素进行等待;当脚本执行的某一元素定位时,如果可以定位,则继续执行,如果定位不到,则以轮询的方式不断的判断元素是否定位到。
九.定位一组元素
Webdriver元素定位方法 | |
id | find_elements_by_id() |
name | find_elements_by_name() |
class name | find_elements_by_class_name() |
tag name | find_elements_by_tag_name() |
link text | find_elements_by_link_text() |
partial link text | find_elements_by_partial_link_text() |
xpath | find_elements_by_xpath() |
css selector | find_elements_by_css_selector() |
from selenium import webdriver
import os,time
driver=webdriver.Firefox()
file_path="file:///"+os.path.abspath("filename")
driver.get("file_path")
inputs=driver.find_element_by_tag_name("input")
for i in inputs:
if i.get_attribute("type")=="checkbox":
i.click()
time.sleep(2)
driver.quit()
十.多表单切换
若遇到/frame/iframe表单嵌套时(webdriver只能在一个页面上对元素进行识别与定位),就需要通过switch_to.frame()方法进行切换。
driver.switch_to.frame()默认可以直接取表单的id或者name属性;、
switch_to.parent_frame():跳出当前表单;
switch_to.parent_content():
switch_to.default_content():跳回最外层的页面;
十一.多窗口切换
当弹出新的窗口时,需切换到新的窗口上进行操作:switch_to.window()
获取当前窗口句柄:driver.current_window_handle
获取当前所有打开的窗口的句柄:driver.window_handles
from selenium import webdriver
driver=webdriver.Firefox()
driver.implicitly_wait(10)
driver.get("http://www.baidu.com")
#获取搜索窗口句柄
search_windows=driver.current_window_handle
driver.find_element_by_link_text("登录").click()
driver.find_element_by_link_text("立即登录").click()
#获取当前所有打开的窗户的句柄
all_handles=driver.window_handles
#进入注册窗口
for handle in all_handles:
if handle!=search_windows:
driver.switch_to.window(handle)
....
for handle in all_handles:
if handle==search_windows:
driver.switch_to.window(handle)
....
driver.quit()
十二.警告框处理
在webdriver中处理JavaSript所生成的alert(警告框),confirm(确认框)以及prompt(提示框),采用switch_to.alert()定位,然后用text,accept,dismiss,sendkeys等方法进行操作;
text:返回alert,confirm,promp中的文字信息;
accept():接受现有的警告框;
dismiss():解散现有的警告框;
sendkeys(keysToSend):发送文本到警告框;
driver.switch_to.alert().accept()
十三.上传文件
1.send_keys()
2.AutoIt(免费):主要用来Windows GUI的自动化测试;用来模拟键盘按键,鼠标移动和窗口/控件的组合来实现自动化任务;
Autoit下载地址:https://www.autoitscript.com/site/autoit/downloads/
十四.操作cookie
Webdriver操作cookie的方法:
get_cookies():获取所有的cookie信息;
get_cookie(name):返回字典的key为name的cookie信息;
add_cookie(cookie_dict):添加cookie;cookie_dict 是字典对象,必须有name额value值;
delete_cookie(name,optionString):删除cookie,name是指要删除是cookie的名称,optionString是该cookie选项,支持的选项包括:“路径”/“域”
Delete_all_cookie():删除所有的cookie信息;
from selenium import webdriver
driver=webdriver.Firefox()
driver.get("http://www.yudao.com")
driver.add_cookie({"name":"key-aaaaa","value":"value-bbbbb"})
for cookie in driver.get_cookies():
print ("%s->%s"%(cookie["name"],cookie["value"]))
driver.quit()
十五.调用javascript
浏览器滚动条的操作:可以借助javascript来控制;
Webdriver提供了excute_script()方法来执行javascript代码;
from selenium import webdriver
from time import sleep
driver=webdriver.Firefox()
driver.get("http://www.baidu.com")
driver.set_window_size(600,600)
driver.find_element_by_id("kw").send_keys("NBA")
driver.find_element_by_id("su").click()
sleep(2)
js="window.scrollTo(100,450)"
driver.execute_script(js)
sleep(3)
driver.quit()
十六.窗口截图
WebDriver提供了截图函数get_screenshot_as_file()来截取当前的窗口;
driver.get_screenshot_as_file("D:\\baidu_img.jpg")