python - 辨识alert、window以及操做

selenium之 辨识alert、window以及操做

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

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


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

1.分辨

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

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

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

  • div假装对话框,是经过网页元素假装成对话框,这种对话框通常比较花哨,内容比较多,并且跟浏览器一看就不是一套,在网页中用firebug可以获取到其的元素,以下图: 
    div假装markdown

2.alert操做

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

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

先列出Alert的全部操做:ui

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

示例代码:url

示例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()

相关文章
相关标签/搜索