什么是selenium?selenium自动化测试工具,它主要是用于Web应用程序的自动化测试,但肯定不只局限于此,同时支持所有基于web的管理任务自动化。selenium经历了两个版本,selenium1.0和selenium2.0,selenium也不是简单一个工具,而是由几个工具组成,每个工具都有其特点和应用场景。SeleniumIDE:SeleniumGridSeleniumRCSelenium2.0SeleniumRC在浏览器中运行JavaScript应用,使用浏览器内置的JavaScript翻译器来翻译和执行selenese命令(selenese是selenium命令集合)。WebDriver通过原生浏览器或者浏览器扩展直接控制浏览器。WebDriver针对各个浏览器而开发,取代了嵌入到被测Web应用中的JavaScript。与浏览器的紧密集成支持创建更高级的测试,避免了JavaScript安全模型导致的限制。除了来自浏览器厂商的支持,WebDriver还利用操作系统级的调用模拟用户输入。webdriver提供了一系列的元素定位方法,常用的有以下几种:id,name,classname,tagname,linktext,partiallinktext,xpath,cssselector分别对应PythonWebdriver中的方法为:find_element_by_link_text(新闻)find_element_by_partial_link_text(新)//局部模糊定位(关键字一定要唯一)Xpath定位用绝对路径定位:find_element_by_xpath(/html/body/div[2]/form/span/input)当我们所要定位的元素很难找到合适的方式时,都可以通过这种绝对路径的方式定位,缺点是当元素在很多级目录下时,我们不得不要写很长的路径,而且这种方式难以阅读和维护。相对路径定位:find_element_by_xpath(//input[@id='input'])#通过自身的id属性定位find_element_by_xpath(//span[@id='input-container']/input)#通过上一级目录的id属性定位find_element_by_xpath(//div[@id='hd']/form/span/input)#通过上三级目录的id属性定位find_element_by_xpath(//div[@name='q']/form/span/input)#通过上三级目录的name属性定位通过上面的例子,我们可以看到XPath的定位方式非常灵活和强大的,而且XPath可以做布尔逻辑运算,例如://div[@id='hd'or@name='q']当然,它的缺陷也非常明显:1、性能差,定位元素的性能要比其它大多数方式差;2、不够健壮,XPath会随着页面元素布局的改变而改变;3.兼容性不好,在不同的浏览器下对XPath的实现是不一样的。操作测试对象:Webdriver中比较常用的操作元素的方法有下面几个:clear清除元素的内容send_keys在元素上模拟按键输入click单击元素submit提交表单submit()要求提交对象是一个表单,更强调对信息的提交。click()更强调事件的独立性。(比如,一个文字链接就不能用submit()方法。)WebElement接口常用方法WebElement接口除了我们前面介绍的方法外,它还包含了别的一些有用的方法。下面,我们例举几个比较有用的方法。size(返回元素的尺寸。)例:#返回百度输入框的宽高size=driver.find_element_by_id(kw).sizeprintsizetext(获取元素的文本)例:#返回百度页面底部备案信息text=driver.find.element_by_id(cp).textprinttextget_attribute(name)(获取属性值)例:#返回元素的属性值,可以是id、name、type或元素拥有的其他任意属性attribute=driver.find_element_by_id(kw).get_attribute('type')printattribute(这个方法在定位一组数据时将变得非常有用)is_displayed()(设置该元素是否用户可见)例:#返回元素的结果是否可见,返回结果为True或Falseresult=driver.find_element_by_id(kw).is_displayed()printresult鼠标事件:实际的web产品测试中发现,有关鼠标的操作,不单单只有单机,有时候还用到右击,双击,拖动等操作,这些操作包含在ActionChains类中。ActionChains类鼠标操作的常用方法:context_click()右击double_click()双击drag_and_drop()拖动move_to_element()鼠标悬停在一个元素上click_and_hold()按下鼠标左键在一个元素上鼠标右击操作:context_click()(右键点击一个元素)例:#引入ActionChains类fromselenium.webdriver.common.action_chainsimportActionChains...#定位到要右击的元素right=driver.find_element_by_xpath(XX)#对定位到的元素执行鼠标右键操作ActionChains(driver).context_click(right).perform()ActionChains(driver):driver:webdriver实例执行用户操作。ActionChains用于生成用户的行为:所有的行为都存储在ActionChains对象。通过perform()执行存储的行为。perform():执行所有ActionChains中存储的行为。perfrom()同样也是ActionChains类提供的方法,通常与ActionChains()配合使用。键盘事件:有时候我们在测试时需要使用tab键将焦点转移到下一个元素,用于验证元素的排序是否正确。webdriver的keys()类提供键盘上所有按键的操作,甚至可以模拟一些组合键的操作,如Ctrl+A,Ctrl+C/Ctrl+V等。在某些更复杂的情况下,还会出现使用send_keys来模拟上下键来操作下拉列表的情况。代码示例:打印信息通常我们可以通过获得页面的title、URL地址,页面上的标识性信息(如:登录成功的“欢迎,XXX”信息)来判断用例执行成功。在实际测试中,访问1个页面然后判断其title是否符合预期是很常见的一个用例,假如一个页面的title应该是“百度一下”,那么用例可以这样描述:访问该页面,判断页面title是否等于“百度一下”。获取当前URL也是非常重要的一个操作,在某些情况下,你访问一个URL,这时系统会自动对这个URL进行跳转,这就是所谓的“重定向”。一般测试重定向的方法是访问这个URL,然后等待页面重定向完毕之后,获取当前页面的URL,判断该URL是否符合预期。如果页面的URL返回不正确,而表示当前操作没有进行正常的跳转。示例代码:设置等待时间:sleep():设置固定休眠时间。Python的time包提供了休眠方法sleep(),导入time包后就可以使用sleep()进行脚本的执行过程进行休眠。implicity_wait():是webdirver提供的一个超时等待。等待一个元素被发现,或一个命令完成。如果超出了设置时间则抛出异常。WebDriverWait():同样也是webdirver提供的方法。在设置时间内,默认每隔一段时间检测一次当前页面元素是否存在,如果超过设置时间检测不到则抛出异常。代码如下:定位一组元素(复选框):WebElement接口同样提供了定位一组元素的方法find_elements。定位一组对象一般用于以下场景:批量操作对象,比如将页面上所有的checkbox都勾上先获取一组对象,再在这组对象中过滤出需要具体定位的一些对象。比如定位出页面上所有的checkbox,然后选择最后一个。示例代码:importosos.path.abspath()os模块为Python语言标准库中的os模块包含普遍的操作系统功能。主要用于操作本地目录文件。path.abspath()方法用于获取当前路径下的文件。另外脚本中还使用到for循环,对inputs获取的一组元素进行循环,在Python语言中循环变量(input)可以不用事先声明直接使用。通过css方式来勾选一组元素,打印当所勾选元素的个数并对最后一个勾选的元素取消勾选。len()len为Python语言中的方法,用于返回一个对象的长度(或个数)。pop()pop也为Python语言中提供的方法,用于删除指定位置的元素,pop()为空默认选择最后一个元素。对话框处理:现在很多前端对话框是div形式的,这就让我们处理变得十分简单。以百度首页登录为例。下面通过脚本对百度进行登录操作。driver.find_element_by_class_name(tang-content).find_element_by_name(userName)第一次定位找到弹出的登录框,在登录框上再次定位找到了用户名输入框。浏览器多窗口处理:WebDriver提供了相关方法可以很轻松的在多个窗口之间切换并操作不同窗口上的元素。要想在多个窗口之间切换,首先要获得每一个窗口的唯一标识符号(句柄)。通过获得的句柄来区别分不同的窗口,从而对不同窗口上的元素进行操作。处理过程:这个处理过程相比我们前面的元素操作来说稍微复杂一些,执行过程为:首选通过nowhandle获得当前窗口(百度首页)的句柄;然后,打开注册窗口(注册页);通过allhandles获得所有窗口的句柄;对所有句柄进行循环遍历;判断窗口是否为nowhandle(百度首页),如果不是则获得当前窗口(注册页)的句柄;然后,对注册页上的元素进行操作。最后,回返到首页。为了使执行过程更多更容易理解,在切换到注册页时,打印了'nowregisterwindow!'一条信息;切换回百度首页时,我们在输入框输入了“注册成功!”。注意,我们在切换到注册页时,只是切换了一下邮箱注册标签,如果要直执行注册过程还需要添加更多的操作步骤。在本例中所有用到的新方法:current_window_handle(获得当前窗口句柄)window_handles(返回的所有窗口的句柄到当前会话)switch_to_window()(用于处理多窗口操作的方法,switch_to_window()用于处理多窗口之前切换,switch_to_frame()用于处理多框架的切换。)close()(如果你足够细心会发现我们在关闭“注册页”时用的是close()方法,而非quit();close()用于关闭当前窗口,quit()用于退出驱动程序并关闭所有相关窗口。)alert/confirm/prompt处理JavaScript所生成的alert、confirm以及prompt是很简单的。具体思路是使用switch_to.alert()方法定位到alert/confirm/prompt。然后使用text/accept/dismiss/send_keys按需进行操做。text返回alert/confirm/prompt中的文字信息。accept点击确认按钮。dismiss点击取消按钮,如果有的话。send_keys输入值,这个alert\confirm没有对话框就不能用了,不然会报错。以百度设置页面为例,脚本如下:switch_to_alert()用于获取网页上的警告信息。我们可以对警告信息做如下操作:下拉框处理:想定位下拉框中的内容,首先需要定位到下拉框;然后二次定位下拉框中的值。示例代码:需要说明的是在实际的web测试