• 1. Python WebDriver API-元素定位webdriver 提供了一系列的元素定位方法,常用的有以下几种 id name class name tag name link text partial link text xpath css selector 分别对应 python webdriver 中的方法为: find_element_by_id() find_element_by_name() find_element_by_class_name() find_element_by_tag_name() find_element_by_link_text() find_element_by_partial_link_text() find_element_by_xpath() find_element_by_css_selector()
  • 2. Python WebDriver API-浏览器操作浏览器最大化 driver.maximize_window() #将浏览器最大化显示 浏览器设置宽高 driver.set_window_size(800, 600) 控制浏览器前进、后退 … driver.get('http://www.baidu.com') #访问百度首页 driver.get(‘http://news.baidu.com’) #访问新闻页面 driver.back() #返回(后退)到百度首页 driver.forward() #前进到新闻页 …
  • 3. Python WebDriver API-操作测试对象webdriver 中比较常用的操作元素的方法有下面几个: clear 清除元素的内容,如果可以的话 send_keys 在元素上模拟按键输入 [这里需要注意的是,我们一般会在脚本开始声明代码的编码格式为utf-8,所以当我们使用中文字符串操作时,应在字符串前面加小u,进行转码标识] send_keys(u“中文内容”) click 单击元素,单击任何可以点击的元素,文字/图片连接,按钮, 下拉按钮等。 submit 提交表单,提交对象是一个表单 … driver.find_element_by_id(“username").clear() driver.find_element_by_id(" username ").send_keys("username") driver.find_element_by_id(“password").clear() driver.find_element_by_id(" password ").send_keys("password") driver.find_element_by_id("loginBtn").click() #通过 submit() 来提交表单 #driver.find_element_by_id("loginBtn").submit() …
  • 4. Python WebDriver API-鼠标事件ActionChains 类鼠标操作的常用方法: context_click() 右击 double_click() 双击 drag_and_drop() 拖动 move_to_element() 鼠标悬停在一个元素上 click_and_hold() 按下鼠标左键在一个元素上
  • 5. Python WebDriver API-键盘事件经常使用到的键盘操作: send_keys(Keys.BACK_SPACE) 删除键(BackSpace) send_keys(Keys.SPACE) 空格键(Space) send_keys(Keys.TAB) 制表键(Tab) send_keys(Keys.ESCAPE) 回退键(Esc) send_keys(Keys.ENTER) 回车键(Enter) send_keys(Keys.CONTROL,'a') 全选(Ctrl+A) send_keys(Keys.CONTROL,'c') 复制(Ctrl+C) send_keys(Keys.CONTROL,'x') 剪切(Ctrl+X) send_keys(Keys.CONTROL,'v') 粘贴(Ctrl+V)
  • 6. Python WebDriver API-打印信息通常我们可以通过获得页面的 title 、URL 地址,页面上的标识性信息(如,登录成功的“欢迎,xxx”信息)来判断用例执行成功。 … #获得前面 title,打印 title = driver.title print title #获得前面 URL,打印 now_url = driver.current_url print now_url #获得登录成功的用户,打印 now_user=driver.find_element_by_id(“userid").text print now_user …
  • 7. Python WebDriver API-设置等待时间有时候为了保证脚本运行的稳定性,需要脚本中添加等待时间。 sleep() : 设置固定休眠时间。 python的time包提供了休眠方法sleep() , 导入time包后就可以使用sleep()进行脚本的执行过程进行休眠。 implicitly_wait(): 是 webdirver 提供的一个超时等待。隐的等待一个元素被发现,或一个命令完成。如果超出了设置时间的则抛出异常。 WebDriverWait(): 同样也是 webdirver 提供的方法。在设置时间内,默认每隔一段时间检测一次当前页面元素是否存在,如果超过设置时间检测不到则抛出异常。
  • 8. Python WebDriver API-定位一组对象# 选择页面上所有的 tag name 为 input 的元素 inputs = driver.find_elements_by_tag_name('input') #然后从中过滤出 tpye 为 checkbox 的元素,单击勾选 for input in inputs: if input.get_attribute('type') == 'checkbox': input.click()
  • 9. Python WebDriver API-层级定位如图,发现两个下拉菜单中每个选项的 link text 都相同,href 也一样,所以在这里就需要使用层级定位了
  • 10. Python WebDriver API-定位frame中对象 webdriver 每次只能在一个页面识别,因此才需要用 switch_to_frame 方法去获取 frame 中嵌入的页面,对那个页面里的元素进行定位。 ... #先找到 iframe1(id = f1) driver.switch_to_frame("f1") #再找到其下面的 iframe2(id =f2) driver.switch_to_frame("f2") ...
  • 11. Python WebDriver API-对话框处理 现在很多前端框架的对话框是 div 形式的,也有一些弹出框iframe处理比较麻烦,如上一节所说的。使用百度登录页面演示一下,这个登录对话框是个div#coding=utf-8 from selenium import webdriver driver = webdriver.Firefox() driver.get("http://www.baidu.com/") #点击登录链接 driver.find_element_by_name("tj_login").click() #通过二次定位找到用户名输入框 div=driver.find_element_by_class_name("tang-content").find_element_by_name("userName") div.send_keys("username") #输入登录密码 driver.find_element_by_name("password").send_keys("password") #点击登录 driver.find_element_by_id("TANGRAM__PSP_10__submit").click() driver.quit()
  • 12. 测试一个 web 应用时会出现多个浏览器窗口的情况,在 selenium1.0 中这个问题比较难处理。webdriver 提供了相关相方法可以很轻松的在多个窗口之间切换并操作不同窗口上的元素。 使用我们教务系统课程库管理,添加课程为例进行解析,完成这个功能共打开了三个浏览器窗口。Python WebDriver API-浏览器多窗口处理在本例中所有用到的新方法: current_window_handle 获得当前窗口句柄 window_handles 返回的所有窗口的句柄到当前会话 switch_to_window() 用于处理多窗口之前切换
  • 13. Python WebDriver API- alert/confirm/prompt 处理 webdriver 中处理 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 没有对话框就不能用了,不然会报错。 使用我们的教务系统登录为例,进行解析 ,当用户名或密码为空时,会弹出alert提示窗口,脚本需要对该弹出框进行处理。driver = driver driver.find_element_by_name("username").clear() driver.find_element_by_name("username").send_keys("") driver.find_element_by_name("password").clear() driver.find_element_by_name("password").send_keys("") time.sleep(2) driver.find_element_by_name("Submit").click() try: alertstr = driver.switch_to_alert() alertTF = True except: alertTF = False if alertTF: print alertstr.text alertstr.accept()
  • 14. Python WebDriver API-下拉框的处理下拉框也是 web页面上非常常见的功能,webdriver 对于一般的下拉框处理起来也相当简单,要想定位下拉框中的内容,首先需要定位到下拉框 使用教务系统中的添加课程窗口中的下拉框选择进行举例,使用不同方式进行实现。
  • 15. Python WebDriver API-调用JavaScript当 webdriver 遇到没法完成的操作时,可以考虑借用 JavaScript 来完成,下面的例子,通过 JavaScript 来隐藏页面上的元素。 webdriver 提供了 execute_script() 接口用来调用 js代码。执行 js 一般有两种场景: 一种是在页面上直接执行 JS 另一种是在某个已经定位的元素上执行 JS#######通过 JS 隐藏选中的元素########## #隐藏文字信息 driver.execute_script('$("#tooltip").fadeOut();') time.sleep(5) #隐藏按钮 button = driver.find_element_by_class_name('btn') driver.execute_script('$(arguments[0]).fadeOut()',button) execute_script(script, *args) 在当前窗口/框架 同步执行 javaScript script:JavaScript 的执行。 *args:适用任何 JavaScript 脚本。
  • 16. Python WebDriver API-调用JavaScript使用JS控制浏览器滚动条 一般用到操作滚动条的会两个场景: 注册时的法律条文的阅读,判断用户是否阅读完成的标准是:滚动条是否拉到最下方。 要操作的页面元素不在视觉范围,无法进行操作,需要拖动滚动条标识滚动条位置的代码: #将页面滚动条拖到底部 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_)
  • 17. Python WebDriver API-cookie处理有时候我们需要验证浏览器中是否存在某个 cookie,因为基于真实的 cookie 的测试是无法通过白盒和集成测试完成的。webdriver 可以读取、添加和删除 cookie 信息。 webdriver 操作 cookie的方法有: get_cookies() 获得所有 cookie 信息 get_cookie(name) 返回特定 name 有 cookie信息 add_cookie(cookie_dict) 添加 cookie,必须有 name 和 value 值 delete_cookie(name) 删除特定(部分)的 cookie信息 delete_all_cookies() 删除所有 cookie 信息… # 获得 cookie 信息 cookie = driver.get_cookies() #将获得 cookie 的信息打印 print cookie …[{u'domain': u'.youdao.com', u'secure': False, u'value': u'aGFzbG9nZ2VkPXRydWU=', u'expiry': 1408430390.991375, u'path': u'/', u'name': u'_PREF_ANONYUSER__MYTH'}, {u'domain': u'.youdao.com', u'secure': False, u'value': u'1777851312@218.17.158.115', u'expiry': 2322974390.991376, u'path': u'/', u'name': u'OUTFOX_SEARCH_USER_ID'}, {u'path': u'/', u'domain': u'www.youdao.com', u'name': u'JSESSIONID', u'value': u'abcUX9zdw0minadIhtvcu', u'secure': False}]运行结果:对Cookie进行操作 … driver = webdriver.Firefox() driver.get("http://www.youdao.com") #向 cookie 的 name 和 value 添加会话信息。 driver.add_cookie({'name':'key-aaaaaaa', 'value':'value-bbbb'}) #遍历 cookies 中的 name 和 value信息打印,当然还有上面添加的信息 for cookie in driver.get_cookies(): print "%s -> %s" % (cookie['name'], cookie['value']) ##### 下面可以通过两种方式删除 cookie ##### # 删除一个特定的 cookie driver.delete_cookie("CookieName") # 删除所有 cookie driver.delete_all_cookies() time.sleep(2) …
  • 18. Python WebDriver API-获取对象属性获取测试对象的属性能够帮我们更好的进行对象的定位。比如页面上有很多标签为 input 元素,而我们需要定位其中 1 个有具有 data-node 属性不一样的元素。由于 webdriver 是不支持直接使用 data-node 来定位对象的,所以我们只能先把所有标签为 input都找到,然后遍历这些 input,获取想要的元素。 通过 find_elements 获得一组元素,通过循环遍历找到想要的元素:# 选择页面上所有的 tag name 为 input 的元素 inputs = driver.find_elements_by_tag_name('input') #然后循环遍历出 data-node 为594434493的元素,单击勾选 for input in inputs: if input.get_attribute('data-node') == '594434493': input.click() ……
  • 19. Python WebDriver 工作原理webdriver 是按照 server – client 的经典设计模式设计的。 server 端就是 remote server,可以是任意的浏览器。当我们的脚本启动浏览器后,该浏览器就是remote server,它的职责就是等待 client 发送请求并做出响应; client 端简单说来就是我们的测试代码,我们测试代码中的一些行为,比如打开浏览器,转跳到特定的 url 等操作是以 http 请求的方式发送给被 测试浏览器,也就是 remote server;remote server 接受请求,并执行相应操作,并在 response 中返回执行状态、返回值等信息; webdriver 的工作流程: 1. WebDriver 启动目标浏览器, 并绑定到指定端口。 该启动的浏览器实例, 做为 web driver 的 remote server。 2. Client 端通过 CommandExcuter 发送 HTTPRequest 给 remote server 的侦听端口(通信协议: the webriver wire protocol) 3. Remote server 需要依赖原生的浏览器组件(如:IEDriverServer .exe、chromedriver .exe) ,来转化转化浏览器的 native 调用。
  • 20. Python WebDriver 小结前面花很多时间都在介绍WebDriver API ,很多API部分,都是在讲元素定位问题,说明在自动化测试脚本的中,元素定位非常重要。 以前我们进行项目开发实施,并不会想到在UI层进行自动化测试,在没有进行自动化测试之前,开发人员以实现功能为目的,前端页面的代码并不很规范,这个也是自动化测试定位难的原因,如果开发人员在设计代码的时候,规范的未元素都加上name和id属性,那将变得容易很多。