自动化-Selenium WebDriver相关技术点总结

前端工具:FireBug&FirePath

setuptools是Python Enterprise Application Kit (PEAK)的一个副项目,它是Python的distutilsde工具的增强工具,可以让程序员更方便的创建和发布Python包,特别是那些对其他包有依赖性的状况。

easy_install命令是由PEAK开发的setuptools包里带的一个简易安装命令,因此使用easy_install实际上是调用setuptools来完成安装模块的工作。

pip是一个安装和管理Python包的工具,通过pip来安装Python包变得十分简单;pip依赖于setuptools,所以在安装pip之前需要安装setuptools。目前Python3并不支持setuptools,因此需要使用distribute。

setuptools下载地址:https://pypi.Python.org/pypi/setuptools
pip下载地址:https://pypi.Python.ory/pypi/pip

Selenium API:

定位方式:参考链接-> http://www.cnblogs.com/fnng/p/3183777.html
#通过id方式定位
browser.find_element_by_id("kw").send_keys("selenium”)

#通过name方式定位
browser.find_element_by_name("wd").send_keys("selenium”)

#通过tag name方式定位
browser.find_element_by_tag_name("input").send_keys("selenium")

#通过class name 方式定位
browser.find_element_by_class_name("s_ipt").send_keys("selenium")

#通过CSS方式定位
1)通过id属性来定位
browser.find_element_by_css_selector("#kw").send_keys("selenium”)
2)通过class属性定位(点号表示通过class属性来定位元素)
browser.find_element_by_css_selector(“.s_ipt”)

#通过xpath方式定位
browser.find_element_by_xpath("//input[@id='kw']").send_keys("selenium”)
browser.find_element_by_xpath(“html/body/div[30]/div/span").click()

#通过partial link方式定位(通过部分文本信息来定位)
browser.find_element_by_partial_link_text(“文本链接").click()

#使用逻辑运算符
browser.find_element_by_xpath(“//input[@id=‘kw’ and @class=‘su’]/span/input”)

#使用By定位元素
find_element(By.ID,”kw”)
find_element(By.CLASS_NAME,”s_ipt")
...等

浏览器窗口大小:
browser.set_window_size(480800)
self.driver.maximize_window()
控制浏览器后退、前进、刷新:
# coding=utf-8
from selenium import webdriver

#使用火狐浏览器
# driver = webdriver.Firefox()
#使用谷歌浏览器executable_path后面跟着chromedriver本地下载路径
driver = webdriver.Chrome(executable_path='/Users/maxdong/Downloads/chromedriver')

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

second_url = 'http://news.baidu.com'
driver.get(second_url)
#返回百度首页
driver.back()
#前进到新闻页
driver.forward()
#刷新
driver.refresh()

简单元素操作:
self.driver.find_element_by_id("userId").clear()
self.driver.find_element_by_id("userId").send_keys(self.username)
self.driver.find_element_by_id("LoginBtn").click()
#提交输入框内容
self.driver.find_element_by_id("query”).submit()
#停留几秒
import time
time.sleep(3)
#计算元素个数
len()
#用于获取列表中的一个元素(默认最后一个)并返回该元素的值
pop()
#把页面上最后一个checkBox的勾选去掉
self.driver.find_element_by_css_selector(‘input[type=checkbox]’).pop.click()

鼠标和键盘事件:

在使用 Selenium WebDriver 做自动化测试的时候,会经常模拟鼠标和键盘的一些行为。比如使用鼠标单击、双击、右击、拖拽等动作;或者键盘输入、快捷键使用、组合键使用等模拟键盘的操作。在 WebDeriver 中,有一个专门的类来负责实现这些测试场景,那就是 Actions 类,在使用该类的过程中会配合使用到 Keys 枚举以及 Mouse、 Keyboard、CompositeAction 等类。
其次,在实际测试过程中,可能会遇到某些按键没办法使用 Actions、Keys 等类来实现的情况。 比如通过使用 Alt+PrtSc 组合键来实现截取屏幕当前活动窗口的图像,在 Keys 枚举中,因为没有枚举出 PrtSc 键,所以没办法通过 Action 的 KeyDown(Keys) 来模拟按下这个动作。
再次是在自动化测试中,可能会遇到一些附件、文件上传的场景,或者是多文件上传,这些在 Selenium2.0 之后,可以直接使用 WebElement 类的 sendKeys() 方法来实现。

鼠标点击操作:
鼠标点击事件有以下几种类型:

清单 1. 鼠标左键点击
Actions action = new Actions(driver);action.click();// 鼠标左键在当前停留的位置做单击操作
action.click(driver.findElement(By.name(element)))// 鼠标左键点击指定的元素

清单 2. 鼠标右键点击
Actions action = new Actions(driver);
 action.contextClick();// 鼠标右键在当前停留的位置做单击操作
action.contextClick(driver.findElement(By.name(element)))// 鼠标右键点击指定的元素

清单 3. 鼠标双击操作
Actions action = new Actions(driver);
 action.doubleClick();// 鼠标在当前停留的位置做双击操作
action.doubleClick(driver.findElement(By.name(element)))// 鼠标双击指定的元素

清单 4. 鼠标拖拽动作
Actions action = new Actions(driver);
// 鼠标拖拽动作,将 source 元素拖放到 target 元素的位置。
 action.dragAndDrop(source,target);
// 鼠标拖拽动作,将 source 元素拖放到 (xOffset, yOffset) 位置,其中 xOffset 为横坐标,yOffset 为纵坐标。
action.dragAndDrop(source,xOffset,yOffset);

在这个拖拽的过程中,已经使用到了鼠标的组合动作,首先是鼠标点击并按住 (click-and-hold) source 元素,然后执行鼠标移动动作 (mouse move),移动到 target 元素位置或者是 (xOffset, yOffset) 位置,再执行鼠标的释放动作 (mouse release)。所以上面的方法也可以拆分成以下的几个执行动作来完成:

action.clickAndHold(source).moveToElement(target).perform();
action.release();

清单 5. 鼠标悬停操作
Actions action = new Actions(driver);
action.clickAndHold();// 鼠标悬停在当前位置,既点击并且不释放
action.clickAndHold(onElement);// 鼠标悬停在 onElement 元素的位置

action.clickAndHold(onElement) 这个方法实际上是执行了两个动作,首先是鼠标移动到元素 onElement,然后再 clickAndHold, 所以这个方法也可以写成 action.moveToElement(onElement).clickAndHold()

清单 6. 鼠标移动操作
Actions action = new Actions(driver);
 action.moveToElement(toElement);// 将鼠标移到 toElement 元素中点
// 将鼠标移到元素 toElement 的 (xOffset, yOffset) 位置,
//这里的 (xOffset, yOffset) 是以元素 toElement 的左上角为 (0,0) 开始的 (x, y) 坐标轴。
 action.moveToElement(toElement,xOffset,yOffset)
// 以鼠标当前位置或者 (0,0) 为中心开始移动到 (xOffset, yOffset) 坐标轴
 action.moveByOffset(xOffset,yOffset);

action.moveByOffset(xOffset,yOffset) 这里需要注意,如果 xOffset 为负数,表示横坐标向左移动,yOffset 为负数表示纵坐标向上移动。而且如果这两个值大于当前屏幕的大小,鼠标只能移到屏幕最边界的位置同时抛出 MoveTargetOutOfBoundsExecption 的异常。
鼠标移动操作在测试环境中比较常用到的场景是需要获取某元素的 flyover/tips,实际应用中很多 flyover 只有当鼠标移动到这个元素之后才出现,所以这个时候通过执行 moveToElement(toElement) 操作,就能达到预期的效果。但是根据我个人的经验,这个方法对于某些特定产品的图标,图像之类的 flyover/tips 也不起作用,虽然在手动操作的时候移动鼠标到这些图标上面可以出现 flyover, 但是当使用 WebDriver 来模拟这一移动操作时,虽然方法成功执行了,但是 flyover 却出不来。所以在实际应用中,还需要对具体的产品页面做相应的处理。

清单 7. 鼠标释放操
Actions action = new Actions(driver);
action.release();// 释放鼠标

键盘事件:

对于键盘的模拟操作,Actions 类中有提供 keyUp(theKey)、keyDown(theKey)、sendKeys(keysToSend) 等方法来实现。键盘的操作有普通键盘和修饰键盘(Modifier Keys, 下面的章节将讲到修饰键的概念)两种 :

1.对于普通键盘,使用 sendKeys(keysToSend) 就可以实现,比如按键 TAB、Backspace 等。

清单 8. 普通键盘模拟 sendKeys(keysToSend)
Actions action = new Actions(driver);
action.sendKeys(Keys.TAB);// 模拟按下并释放 TAB 键
action.sendKeys(Keys.SPACE);// 模拟按下并释放空格键
/***
针对某个元素发出某个键盘的按键操作,或者是输入操作,
比如在 input 框中输入某个字符也可以使用这个方法。这个方法也可以拆分成:
action.click(element).sendKeys(keysToSend)。
*/
action.sendKeys(element,keysToSend);

注意除了 Actions 类有 sendKeys(keysToSend)方法外,WebElement 类也有一个 sendKeys(keysToSend)方法,这两个方法对于一般的输入操作基本上相同,不同点在于以下几点:
Actions 中的 sendKeys(keysToSend) 对于修饰键 (Modifier Keys) 的调用并不会释放,也就是说当调用 actions.sendKeys(Keys.ALT); actions.sendKeys(Keys.CONTROL); action.sendKeys(Keys.SHIFT); 的时候,相当于调用 actions.keyDown(keysToSend),而如果在现实的应用中想要模拟按下并且释放这些修饰键,应该再调用 action.sendKeys(keys.NULL) 来完成这个动作。
其次就是当 Actions 的 sendKeys(keysToSend) 执行完之后,焦点就不在当前元素了。所以我们可以使用 sendKeys(Keys.TAB) 来切换元素的焦点,从而达到选择元素的作用,这个最常用到的场景就是在用户名和密码的输入过程中。
第三点,在 WebDriver 中,我们可以使用 WebElement 类的 sendKeys(keysToSend) 来上传附件,比如 element.sendKeys(“C:\test\uploadfile\test.jpg”); 这个操作将 test.jpg 上传到服务器,但是使用:

Actions action = New Actions(driver);
action.sendKeys(element,“C:\\test\\upload\\test.jpg”);
action.click(element).sendKeys(“C:\\test\\upload\\test.jpg”);

这种方式是上传不成功的,虽然 WebDriver 在执行这条语句的时候不会出错,但是实际上并没有将文件上传。所以要上传文件,还是应该使用前面一种方式。

2.对于修饰键(Modifier keys),一般都是跟普通键组合使用的。比如 Ctrl+a、Alt+F4、 Shift+Ctrl+F 等等。
这里先解释一下修饰键的概念,修饰键是键盘上的一个或者一组特别的键,当它与一般按键同时使用的时候,用来临时改变一般键盘的普通行为。对于单独按下修饰键本身一般不会触发任何键盘事件。在个人计算机上的键盘上,有以下几个修饰键:Shift、Ctrl、Alt(Option)、AltGr、Windows logo、Command、FN(Function)。但是在 WebDriver 中,一般的修饰键指前面三个。你可以点击下面的 Wiki 链接去了解更多有关修饰键的信息,Modifier key。
回到上面的话题,在 WebDriver 中对于修饰键的使用需要用到 KeyDown(theKey)、keyUp(theKey) 方法来操作。

清单 9. 修饰键方法 KeyDown(theKey)、keyUp(theKey)
Actions action = new Actions(driver);
action.keyDown(Keys.CONTROL);// 按下 Ctrl 键
action.keyDown(Keys.SHIFT);// 按下 Shift 键
action.keyDown(Key.ALT);// 按下 Alt 键
action.keyUp(Keys.CONTROL);// 释放 Ctrl 键
action.keyUp(Keys.SHIFT);// 释放 Shift 键
action.keyUp(Keys.ALT);// 释放 Alt 键

所以要通过 Alt+F4 来关闭当前的活动窗口,可以通过下面语句来实现:action.keyDown(Keys.ALT).keyDown(Keys.F4).keyUp(Keys.ALT).perform();
而如果是对于像键盘上面的字母键 a,b,c,d… 等的组合使用,可以通过以下语句实现 :action.keyDown(Keys.CONTROL).sednKeys(“a”).perform();
在 WebDriver API 中,KeyDown(Keys theKey)、KeyUp(Keys theKey) 方法的参数只能是修饰键:Keys.SHIFT、Keys.ALT、Keys.CONTROL, 否者将抛出 IllegalArgumentException 异常。 其次对于 action.keyDown(theKey) 方法的调用,如果没有显示的调用 action.keyUp(theKey) 或者 action.sendKeys(Keys.NULL) 来释放的话,这个按键将一直保持按住状态。

显示等待和隐式等待:

显示等待:使WebdDriver等待某个条件成立时继续执行,否则在达到最大时长时抛出超时异常。

element = WebDriverWait(driver, 5, 0.5).until(expected_conditions.presence_of_element_located(By.ID, "kw")))
element.send_keys('selenium’)

隐式等待:是通过一定的时长等待页面上某元素加载完成。如果超出了设置的时长元素还没被加载,则抛出NoSuchElementEception异常。WebDriver提供了implicitly_wait()方法来实现隐式等待,默认设置为0.

element = WebDriverWait(driver, 5, 0.5).until(expected_conditions.presence_of_element_located(By.ID, "kw")))
element.send_keys('selenium’)

多表单切换:

通过switch_to.frame()方法将当前定位的主题切换为frame/iframe表单的内嵌页面中。

driver.switch_to.frame(“if”)
#下面就可以正常进行元素操作了
…..

多窗口切换:

通过switch_to.window()方法,可以实现在不同的窗口之间切换.

警告框处理:

通过switch_to_alert()方法定位到alert/confirm/prompt,然后使用text/accept/dismisss/send_keys等方法进行操作

text:返回alert/confirm/prompt中的文字信息
accept():接受现有警告框
dismiss():解散现有警告框
send_keys(keysToSend):发送文本至警告框 keysToSend:讲文本发送至警告框。

#接收警告框
driver.switch_to_alert().accept()

文件上传、下载:

普通上传:普通附件上传是将本地文件的路径作为一个值放在input标签中,通过form表单将这个值提交给服务器。
插件上传:一般指基于Flash\JavaScript\Ajax等技术所实现的上传功能
下载:需要通过FirefoxProfile()对其做一些设置:

browser.download.folderList  浏览器默认下载路径
browser.download.manager.showWhenStarting 是否显示开始
browser.download.dir 用于指定所下载文件的目录
browser.helperApps.neverAsk.saveToDisk 指定要下载页面的Content-type值  ”application/octet-stream“为文件的类型

1)send_keys实现上传:
driver.find_element_by_name(“file”).send_keys(‘D:\upload_file_txt’)

2)Autolt上传:
是一个使用类似BASIC脚本语言的免费软件,被设计用来进行Window GUI图形界面自动化测试。
它利用模拟键盘按键,鼠标移动和窗口、控件的组合来实现自动化任务。
Cookies/窗口截图:
driver.get_cookies()
driver.get_screenshot_as_file(“D:\image\upload_ima.jpg”)

WebDriver原理:

WebDrive是按照server-client的经典设计模式来设计的。
Server就是Remote Server,可以是任意的浏览器。当我们的脚本启动浏览器后,该浏览器就是Remote Server,它的职责就是等待Client发送请求并作出响应。
Client端简单来说就是我们的测试代码。

WebDriver的工作流程:
1)WebDriver启动目标浏览器,并绑定到指定端口。启动的浏览器实例将作为WebDriver的Remote Server
2)Client端通过CommandExcuter发送HTTPRequest给Remote Server的侦听端口
3)Remote Server需要依赖原生的浏览器组件(chromedriver等)来转化浏览器的native调用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值