Selenium-Switch与SelectApi接口详解
switch
我们在UI自动化测试时会出现新建一个tab弹出一个浏览器级别的弹框或者一个iframe,selenium为我们提供switch_to模块
导入:
# 第一种方式可以通过直接导入SwitchTo模块来进行操作
from selenium.webdriver.remote.switch_to import SwitchTo
# 第二种方式是直接通过Webdriver的switch_to来操作
driver.switch_to
其实webdriver在以前的版本中已经为我们封装好了切换Windows、Alert、Iframe,现在依然可以使用,但是会被打上横线,代表他已经过时了,建议使用SwitchTo类来进行操作。
SwitchToWindows
之前在webdriver api中已经介绍是切换浏览器句柄的,很有用
handle = driver.current_window_handle返回当前浏览器句柄
handles = driver.window_handles所有句柄
eg:
def open_new_window(self, css):
'''
Open the new window and switch the handle to the newly opened window.
Usage:
driver.open_new_window()
'''
original_windows = self.driver.current_window_handle
el = self.get_element(css)
el.click()
all_handles = self.driver.window_handles
for handle in all_handles:
if handle != original_windows:
self.driver.switch_to.window(handle)
SwitchToFrame
用于切换iframe
什么是iframe?
iframe其实就是在一个页面中插入一个页面,通常来说一个页面只能有一个body,插入iframe后在iframe中还能有body。
driver.switch_to.frame(frameElement) 移动到指定iframe
# 接受定位到的iframe的Element,这样就可以通过任意一种定位方式进行定位了
frameElement = driver.find_element_by_name('top-frame')
driver.switch_to.frame(frameElement)
# 通过fame的name、id属性定位
driver.switch_to.frame('top-frame')
# 当存在多层iframe嵌套时,需要一层一层的切换查找,否则将无法找到
driver.switch_to.frame('top-frame')
driver.switch_to.frame('baidu-frame')
# 跳转到最外层的页面
driver.switch_to.default_content()
# 多层Iframe时,跳转到上一层的iframe中
driver.switch_to.parent_frame()
eg:
# driver.execute_script("window.scrollTo(0,0);")
# ele1 = driver.find_element_by_css_selector('[name="top-frame"]')
# driver.switch_to.frame(ele1)
# ele2=driver.find_element_by_css_selector('[name="baidu-frame"]')
# driver.switch_to.frame(ele2)
# time.sleep(2)
# driver.find_element_by_css_selector('#kw').send_keys("人才!!!!")
# time.sleep(2)
# # driver.switch_to.parent_frame()
# # time.sleep(2)
# # driver.switch_to.parent_frame()
# driver.switch_to.default_content() # 跳转到最外层的页面
# driver.find_element_by_css_selector('#i1').send_keys(9999)
def switch_to_frame(self, css):
'''
Switch to the specified frame.
Usage:
driver.switch_to_frame("css=>#el")
'''
self.element_wait(css)
iframe_el = self.get_element(css)
self.driver.switch_to.frame(iframe_el)
SwitchTAlert
from selenium.webdriver.common.alert import Alert
# 也可以通过Webdriver的switch_to来调用
# 点击确认按钮
driver.switch_to.alert.accept()
# 如果是确认弹框,相当于点击需要和X按钮
driver.switch_to.alert.dismiss()
# 如果alert上有文本框时,可以输入文字。(注: 没遇到过)
driver.switch_to.alert.send_keys()
# 返回Alert上面的文本内容
text = driver.switch_to.alert.text
egdef accept_alert(self): ''' Accept warning box.
Usage:
driver.accept_alert()
'''
self.driver.switch_to.alert.accept()
def dismiss_alert(self):
'''
Dismisses the alert available.
Usage:
driver.dismiss_alert()
'''
self.driver.switch_to.alert.dismiss()
在Ui自动化测试过程中,经常会遇到一些下拉框,如果我们基于Webdriver操作的话就需要点击两次或者操作js,但是这很容易出问题
selenium专门提供了Select(下拉框处理模块)
通过select选项的索引来定位选择对应选项(从0开始计数)
Select(s).select_by_index(5)
# 通过选项的value属性值来定位
Select(s).select_by_value('2')
# 通过选项的文本内容来定位
Select(s).select_by_visible_text('牡丹江')
# 返回第一个选中的optionElement对象
Select(s).first_selected_option
# 返回所有选中的optionElement对象
Select(s).all_selected_options
# 取消所有选中的option
Select(s).deselect_all()
# 通过option的index来取消对应的option
Select(s).deselect_by_index(1)
# 通过value属性,来取消对应option
Select(s).deselect_by_value('')
# 通过option的文本内容,取消对应的option
Select(s).deselect_by_visible_text('')
eg:
def select_by_value(self, css, value):
self.element_wait(css)
el = self.get_element(css)
Select(el).select_by_value(value)
driver.execute_script('window.scrollTo(0,1800);')
ele = driver.find_element_by_xpath("//select[@name='city'][1]")
Select(ele).select_by_value('4')
print(Select(ele).select_by_value('4'))
不深思则不能造于道。不深思而得者,其得易失。