zoukankan      html  css  js  c++  java
  • selenium处理常见自动化场景

    定位一组对象

    webdriver使用find_element方法定位一个特定的对象,
    定位一组元素的方法叫:find_elements。

    定位一组对象一般用于以下场景:

    • 批量操作对象,比如将页面上的checkbox都勾选上
    • 先获取一组对象,再在这组对象中过滤需要具体定位的一些对象。

    举例:使用tag_name定位一组指定页面上的checkbox

    filepath='file:///'+ os.path.abspath('checkbox.html')
    driver.get(filepath)
    inputs=driver.find_elements_by_tag_name("input")
    for input in inputs:
        if input.get_attribute('type')=='checkbox':
            input.click()
    

    层级定位

    在实际的项目测试中,经常会遇到无法直接定位到需要选取的元素,但是其父元素比较容易定位,通过定位父元素再遍历其子元素选择需要的目标元素,或者需要定位某个元素下所有的子元素。

    层级定位的思想是先定位父对象,然后再从父对象中精确定位出其我们需要选取的后代元素。

    driver.find_element_by_id('***').find_element_by_link_text('***')
    

    定位frame中的对象

    再web应用中经常会出现frame嵌套的应用,假设页面上有A,B两个frame,其中B在A内,那么定位B中的内容则需要先到A,再到B。

    switch_to_frame方法可以把当前定位的主题切换到frame里,在frame里实际是嵌套了另外一个页面,而webdriver每次只能在一个页面识别,所以switch_to_frame方法去获取frame中嵌套的页面。

    driver.switch_to.frame('frame 1')  #移动到id为frame 1的frame上
    print driver.find_element_by_css_selector("#div1").text
       
    driver.switch_to.default_content()  #将识别的主体切换出frame
    print driver.find_element_by_css_selector("#id1").text
    

    备注:
    switch_to.frame的参数必须是id或者是name,所以一个frame只要有id和name处理起来很容易。如果没有的话,两种解决思路:
    1、让开发加上id或者name
    2、使用xpath等方式定位然后实现跳转

    alert/confirm/prompt处理

    具体思路是使用switch_to.alert()方法定位到当前的alert/confirm/prompt(这里注意当前页面只能同时含有一个控件,如果多了会报错的,所以这就需要处理了),然后在调用Alert的方法进行操作。
    Alert提供了以下几个方法:
    text:返回alert/confirm/prompt中的内容
    accept:点击确认按钮
    dismiss:点击取消按钮
    sendKeys:向Prompt中输入文字

    下拉框处理

    1、下拉框通过元素定位识别

    driver.find_element(By.XPATH,'//option[@value="mango"]').click()  
    #以上元素为下拉框中的选项
    

    2、创建一个select的对象,然后通过相应方法处理

    selectElement=driver.find_element(By.XPATH,'//select[@id="Selector"]')
    s=Select(selectElement)
    s.select_by_index(2)  #索引定位,索引从0开始
    time.sleep(2)
    s.select_by_value("mango")  #value属性值
    time.sleep(2)
    s.select_by_visible_text("桔子") #可见文本内容
    

    调用javascript

    当webdriver遇到无法完成的操作时候,这个时候可以使用javascript来完成,webdriver提供了execute_script()接口来调用js代码。

    执行js有两种场景:
    一种是在页面上直接执行js
    另一种是在某个已经定位的元素上执行js

    driver.execute_script('alert("hello!!");')  #弹出窗口
    
    driver.execute_script("arguments[0].style.border='5px solid red'",wl)  #加边框
    
    js="var user_input=document.getElementById('su').getAttribute('id');return user_input;"
    driver.execute_script(js)  #识别并获取对象属性
    driver.execute_script("document.body.scrollTop=10000;")  #浏览器滚动条滚动
    
    js='arguments[0].removeAttribute("value");'  #移除元素的value属性
    js='arguments[0].setAttribute("value","newdream");'  #设置元素的value属性
    driver.execute_script(js.wl)
    

    多窗口处理

    有时候我们在测试一个web应用的时候会出现多个浏览器窗口的情况,
    webdriver提供了相应的解决方案,如下:
    首先要获得每一个窗口的唯一表示符号(句柄),通过获得的句柄来区分不同的窗口,从而对不同窗口的元素进行操作。

    举例:

    current_handle=driver.current_window_handle  #获得当前窗口的句柄
    driver.find_element(By.LINK_TEXT,"另一个页面").click()
    time.sleep(3)
    handle_list=driver.window_handles   #获得所有窗口的句柄
    for h in handle_list:
        if h!=current_handle:
            driver.switch_to.window(h)  #通过句柄跳转窗口
    
    # driver.close()  #关闭新打开的窗口
    
    #回到前面的页面
    driver.switch_to.window(current_handle)
    

    处理验证码

    解决验证码的方法如下:
    1、去掉验证码:在测试环境去掉,对于开发来说屏蔽相关验证码代码
    2、设置万能码:只要用户输入这个万能码,程序就认为验证通过
    3、验证码识别技术:可以通过python-tesseract来识别图片验证码,python-tesseract是光学字符识别Tesseract OCR引擎的Python封装类。不过不能达到100%识别

    举例:

    from RIL import Image
    from pytesseract import pytesseract
    img=Image.open(r'c:index.png')
    a=pytesseract.image_to_string(img)
    print a
    

    4、记录cookie:通过向浏览器添加cookie可以绕过登录的验证码,在用户登录之前,通过add_cookie()方法将用户名和密码写入cookie,使用该方法最大难点是如何获取用户名和密码的cookie信息,可以通过get_cookies()或者询问开发解决此问题。

    处理cookie

    假如我们需要验证浏览器中是否存在cookie,因为基于真实的cookie是无法通过白盒和集成测试完成的,webdriver可以读取、添加和删除cookie信息webdirver操作cookie的方法如下:

    • get_cookies() 获取所有cookie信息
    • get_cookie(name) 返回特定name有cookie信息
    • add_cookie(cookie_dict) 添加cookie,必须有name和value值
    • delete_cookie(name) 删除特定部分的cookie信息
    • delete_all_cookie() 删除所有cookie信息

    举例:

    #获取所有cookie并打印
    driver.get("http://www.youdao.com")
    for cookie in driver.get_cookies():
        print "%s -> %s"%(cookie['name'],cookie['value'])
    #添加cookie举例
    driver.add_cookie({'name':'key-aaaaa','value':'value-bbbb'})
    driver.delete_cookie("key-aaaaa")  #删除cookie
    

    cookie处理

    利用cookie完成网站的免密码应用
    代码思路:
    第一阶段
    打开网站的登录界面
    获取登录之前的cookie
    等待60s,这个时间手动去输入用户名、密码、验证码登录
    获取登录之后的cookie
    把登录之后的cookie与登录之前的cookie打印并进行对比
    找出登录之后不同的cookie或增加的cookie信息

    第二阶段:
    新编写一个脚本
    打开网站的登录页面
    用add_cookie()方式去逐项增加登录之后不同的cookie
    刷新网站,即可完成自动登录操作

    #第一阶段代码实例(禅道举例):
    driver.get("禅道地址")
    cookies=driver.get_cookies()
    for cookie in cookies:
        print(cookie)
    time.sleep(60)  #暂停目的,做手工登录操作
    print("登录之后的cookie")
    cookies=driver.get_cookies()
    for cookie in cookies:
        print(cookie)
    
    #第二阶段代码实例(禅道举例):
    driver.get("禅道地址")
    driver.add_cookie({'name':'sid','value':'ge1o36obij20g1fktssm7oeki2','domain':'192.168.4.160','path':'/'})
    time.sleep(2)
    driver.refresh()
    

    备注:add_cookie()里面放置字典参数,cookie字典一般需要包含name、value、domain、path等字段,如果遇到cookie有Expirse字段,要去掉

  • 相关阅读:
    联合索引和多个单列索引选择
    CentOS6.5 一台服务器同时安装多个Mysql数据库
    一次CentOS的服务器被攻击教训
    java版本的memcache静态化
    mysql存储空间满的处理方式
    MariaDB 10.0 和 MariaDB 10.1 存储过程中 PREPARE FROM EXECUTE 区别
    CentOS6.x 优化脚本
    Mysql 使用 “LOAD DATA INFILE”需要注意的问题
    Mysql 日期类型比较 TIMESTAMPDIFF
    CentOS6.x 源码安装Nginx
  • 原文地址:https://www.cnblogs.com/TD1900/p/11975782.html
Copyright © 2011-2022 走看看