zoukankan      html  css  js  c++  java
  • python

    selenium之 辨识alert、window以及操作

    原创 2016年08月24日 11:01:04

    更多关于python selenium的文章,请关注我的专栏:Python Selenium自动化测试详解


    很多人分辨不出什么是alert、什么是window,今天讨论下怎么辨识alert和window,以及页面元素如div伪装的对话框。

    1.分辨

    首先区别下alert、window和伪装对话框:

    • alert,浏览器弹出框,一般是用来确认某些操作、输入简单的text或用户名、密码等,根据浏览器的不同,弹出框的样式也不一样,不过都是很简单的一个小框。在firebug中是无法获取到该框的元素的,也就是说alert是不属于网页DOM树的。如下图所示: 
      alert1 
      alert2 
      alert3

    • window,浏览器窗口,点击一个链接之后可能会打开一个新的浏览器窗口,跟之前的窗口是平行关系(alert跟窗口是父子关系,或者叫从属关系,alert必须依托于某一个窗口),有自己的地址栏、最大化、最小化按钮等。这个很容易分辨。

    • div伪装对话框,是通过网页元素伪装成对话框,这种对话框一般比较花哨,内容比较多,而且跟浏览器一看就不是一套,在网页中用firebug能够获取到其的元素,如下图: 
      div伪装

    2.alert操作

    针对alert,selenium提供了相应的类来进行处理。

    selenium.webdriver.common.alert.Alert(driver)

    先列出Alert的所有操作:

    Alert(driver).accept()  # 等同于点击“确认”或“OK”
    Alert(driver).dismiss()  # 等同于点击“取消”或“Cancel”
    Alert(driver).authenticate(username,password)  # 验证,针对需要身份验证的alert,目前还没有找到特别合适的示例页面
    Alert(driver).send_keys(keysToSend)  # 发送文本,对有提交需求的prompt框(上图3)
    Alert(driver).text  # 获取alert文本内容,对有信息显示的alert框
    • 1
    • 2
    • 3
    • 4
    • 5

    示例代码:

    示例1:switch_to.alert , accept() , text

    测试链接http://sahitest.com/demo/alertTest.htm

    # -*- coding: utf-8 -*-
    from selenium import webdriver
    from time import sleep
    
    driver = webdriver.Firefox()
    driver.maximize_window()
    driver.get('http://sahitest.com/demo/alertTest.htm')
    
    driver.find_element_by_name('b1').click()
    
    a1 = driver.switch_to.alert  # 通过switch_to.alert切换到alert
    sleep(1)
    print a1.text  # text属性输出alert的文本
    a1.accept()  # alert“确认”
    sleep(1)
    
    driver.quit()
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    结果

    Alert Message
    • 1

    示例2:Alert(driver) , dismiss()

    测试链接http://sahitest.com/demo/confirmTest.htm

    # -*- coding: utf-8 -*-
    from selenium import webdriver
    from time import sleep
    from selenium.webdriver.common.alert import Alert
    
    driver = webdriver.Firefox()
    driver.maximize_window()
    driver.get('http://sahitest.com/demo/confirmTest.htm')
    
    driver.find_element_by_name('b1').click()
    
    a1 = Alert(driver)  # 直接实例化Alert对象
    sleep(1)
    print a1.text  # text属性输出alert的文本
    a1.dismiss()  # alert“取消”
    sleep(1)
    
    driver.quit()
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    结果

    Some question?
    • 1

    示例3:switch_to.alert , send_keys(keysToSend)

    测试链接http://sahitest.com/demo/promptTest.htm

    # -*- coding: utf-8 -*-
    from selenium import webdriver
    from time import sleep
    
    driver = webdriver.Firefox()
    driver.maximize_window()
    driver.get('http://sahitest.com/demo/promptTest.htm')
    
    driver.find_element_by_name('b1').click()
    
    a1 = driver.switch_to.alert  # 通过switch_to.alert切换到alert
    sleep(1)
    print a1.text  # text属性输出alert的文本
    a1.send_keys('send some words to alert!')  # 往prompt型alert中传入字符串
    sleep(1)
    a1.accept()
    print driver.find_element_by_name('t1').get_attribute('value')
    driver.quit()
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    结果

    Some prompt?
    send some words to alert!
    • 1
    • 2

    authenticate(username,password)方法没有找到合适的示例网页,不在这里写示例代码,不过用法是和send_keys一样,不过是传入两个参数而已。并且这种框很少出现,便不做更多研究。

    3.window操作

    window类似于alert,不过与原window是平行的,所以只需要切换到新的window上便可以操作该window的元素。

    driver.switch_to.window(window_handle)

    而window是通过window句柄handle来定位的。而selenium提供了两个属性方法来查询window句柄:

    driver.current_window_handle 
    driver.window_handles

    用以上两个属性获取到当前窗口以及所有窗口的句柄,就可以切换到其他的window了。

    示例代码:

    测试链接http://sahitest.com/demo/index.htm

    # -*- coding: utf-8 -*-
    from selenium import webdriver
    from time import sleep
    from selenium.webdriver.common.alert import Alert
    
    driver = webdriver.Firefox()
    driver.maximize_window()
    driver.get('http://sahitest.com/demo/index.htm')
    
    current_window = driver.current_window_handle  # 获取当前窗口handle name
    driver.find_element_by_link_text('Window Open Test With Title').click()
    
    all_windows = driver.window_handles  # 获取所有窗口handle name
    # 切换window,如果window不是当前window,则切换到该window
    for window in all_windows:
        if window != current_window:
            driver.switch_to.window(window)
    
    print driver.title  # 打印该页面title
    
    driver.close()
    driver.switch_to.window(current_window)  # 关闭新窗口后切回原窗口,在这里不切回原窗口,是无法操作原窗口元素的,即使你关闭了新窗口
    print driver.title  # 打印原页面title
    
    driver.quit()
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    结果:

    With Title
    Sahi Tests
    • 1
    • 2

    这里有一些注意事项:

    1. 只能通过window的name来切换窗口,但window的name不是你想象的窗口title之类的,而是一串字符串,如‘{976ae257-19be-4b32-a82e-4ba5063ed0a2}’,所以你用title、url之类的想切window是不可能的
    2. 关闭了新窗口之后,driver并不会自动跳转回原窗口,而是需要你switch回来,直接去定位窗口元素会报NoSuchElementException

    3.div类对话框

    div类对话框是普通的网页元素,通过正常的find_element就可以定位并进行操作。不在这里进行详述。注意设置一定的等待时间,以免还未加载出来便进行下一步操作,造成NoSuchElementException报错。

    #对于对话框是frame的对话框,采用switch_to_frame来进行定位。当遇到对话框是DIV的时候则采用本文的方法进行处理

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

    #点击登录链接
    driver.find_element_by_name('tj_login').click()

    #通过二次定位找到用户名输入框。先找到弹出的DIV,然后再在页面上定位到需要操作的元素
    div = driver.find_element_by_class_name('tang-content').find_element_by_name('userName')
    div.send_keys('username')

    #输入登录密码
    driver.find_element_by_name('password')

    #点击登录
    driver.find_element_by_id('TANGRAM_PSP_10_submit').click()

  • 相关阅读:
    在Android中通过导入静态数据库来提高应用第一次的启动速度
    《sqlite权威指南》读书笔记 (一)
    Android APK反编译详解(附图)
    Android如何防止apk程序被反编译
    PopupWindow 学习总结
    Android开源框架Afinal第一篇——揭开圣女的面纱
    教程] 《开源框架-Afinal》之FinalHttp 01一步一脚
    android 下改变默认的checkbox的 选中 和被选中 图片
    Android设置RadioButton在文字的右边
    Android Selector 与 Shape 基本用法
  • 原文地址:https://www.cnblogs.com/thb-blog/p/7614526.html
Copyright © 2011-2022 走看看