Switch
我们在UI自动化测试时,总会出现新建一个tab页面,弹出一个浏览器级别的弹框或者是出现一个iframe标签,这时我们用WebDriver提供的Api接口就无法处理这些情况了。需要用到Selenium单独的模块switch_to模块
引用路径:
# 第一种方式可以通过直接导入SwitchTo模块来进行操作 from selenium.webdriver.remote.remote.switch_to import SwitchTo # 第二种方式是直接通过Webdriver的switch_to来操作 driver.switch_to
webdriver在以前的版本中已经为我们封装好了切换Windows,alert,iframe,现在依然可以使用,但是会被打上横线,代表他已经过时了,建议使用SwitchTo类来进行操作。
SwitchToWindows
handles=driver.window_handles # SwitchToWindows接受浏览器TAB的句柄 driver.sitch_to.windows(handles[1])
#获取当前的tab名称 # handle=driver.current_window_handle # print(handle) #获取所有tab名称 driver.find_element_by_css_selector('[href="/new-index/"]').click() handles=driver.window_handles print(handles) #切换tab页面 driver.switch_to.window(handles[1]) #验证是否正确切换到第二个页面上 driver.find_element_by_css_selector('#newtag').send_keys(1111)
SwitchToFrame
#SwichToFrame支持id,name,frame的element # 接受定位到的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()
from selenium import webdriver driver=webdriver.Chrome() driver.get("http://ui.imdsx.cn/uitester/") driver.maximize_window()#将窗口放大 driver.execute_script('window.scrollTo(0,0);') #切换iframe # driver.switch_to.frame('top-frame') iframe=driver.find_element_by_css_selector('iframe[src="/new-index/"]') driver.switch_to.frame(iframe) driver.find_element_by_css_selector('#newtag').send_keys(1111) #iframe 一定要一层一层找,层级一旦错误就定位失败 driver.switch_to.frame('baidu-frame') driver.find_element_by_css_selector('#kw').send_keys(1111) #返回到上一级iframe driver.switch_to.parent_frame() driver.find_element_by_css_selector('#newtag').clear() #一次返回到最外层的iframe driver.switch_to.default_content() driver.find_element_by_css_selector('#i1').send_keys(2222)
SwitchToAlert
# alert 实际上也是Selenium的一个模块 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
from selenium import webdriver driver=webdriver.Chrome() driver.get("http://ui.imdsx.cn/uitester/") driver.maximize_window()#将窗口放大 driver.execute_script('window.scrollTo(0,0);') e=driver.find_element_by_css_selector('#alert') e.click() import time time.sleep(2) print(driver.switch_to.alert.text)#获取alert弹窗中的文本内容 driver.switch_to.alert.accept()#点击alert的确定按钮
from selenium import webdriver driver=webdriver.Chrome() driver.get("http://ui.imdsx.cn/uitester/") driver.maximize_window()#将窗口放大 driver.execute_script('window.scrollTo(0,0);') el=driver.find_element_by_css_selector('#confirm') el.click() import time time.sleep(2) print(driver.switch_to.alert.text) # driver.switch_to.alert.accept()#点击确定 driver.switch_to.alert.dismiss()#点击取消
Select
在UI自动化测试过程中,经常会遇到一些下拉框,如果我们基于Webdriver操作的话就需要click两次,而且很容易出现问题,实际上Selenium给我们提供了专门的Select(下拉框处理模块)。
引用路径:
from selenium.webdriver.support.select import Select
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('')
from selenium import webdriver driver=webdriver.Chrome() driver.get("http://ui.imdsx.cn/html/") driver.maximize_window()#将窗口放大 driver.execute_script('window.scrollTo(0,0);') from selenium.webdriver.support.select import Select #应用select模块必须为select标签编写的下拉框 #如果select元素不在页面中展示时(需要加载时),需要滑动到该元素位置时,才能操作:使用driver.execute_script('window.scrollTo(0,1800);'),高度自己调节 s=driver.find_element_by_xpath('//select[1]') # Select(s).select_by_index(3)#四川 Select(s).select_by_value('3')#北京 #当你的元素中还含有元素的话,就可以在find element来缩小范围
from selenium import webdriver driver=webdriver.Chrome() driver.get("http://ui.imdsx.cn/uitester/") driver.maximize_window()#将窗口放大 driver.execute_script('window.scrollTo(0,0);') from selenium.webdriver.support.select import Select print(driver.find_element_by_css_selector('#on').is_selected()) print(driver.find_element_by_css_selector('#off').is_selected())#是否被选中()