Switch

  我们在UI自动化测试时,总会出现新建一个tab页面、弹出一个浏览器级别的弹框或者是出现一个iframe标签,这时我们用WebDriver提供的Api接口就无法处理这些情况了。需要用到Selenium单独提供的模块switch_to模块

SwitchToWindows

 handles = driver.window_handles

 # SwitchToWindows接受浏览器TAB的句柄
driver.switch_to.window(handles[1])

例子:

 # 浏览器句柄及指针切换
print(driver.window_handles) # 获取所有打开server的浏览器句柄,返回的是一个list
bl = driver.find_element_by_css_selector('[href="/new-index/"]')
bl.click() # 点击连接打开一个新的页面
print(driver.window_handles) # 再次获取所有打开server的浏览器句柄
handes = driver.window_handles
driver.switch_to.window(handes[1]) # 切换浏览器句柄到新打开的这个页面
cl = driver.find_element_by_css_selector('#newtag')
cl.send_keys('AAAA')
driver.close() # 关闭当前指针指向句柄的页面
driver.switch_to.window(handes[0]) # 手动将浏览器指针切换回之前的页面
driver.find_element_by_css_selector('#i1').send_keys('EEEE')
driver.quit() # 关闭所有页面

SwitchToFrame

 # SwitchToFrame支持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()

例子:

 # 多层iframe切换,需要一层一层进入,但是能从任意一层切换到最外层
# 切换到top-frame
driver.switch_to.frame('top-frame')
import time
time.sleep(1)
# 输入newtag文案
driver.find_element_by_css_selector('#newtag').send_keys('XXXX')
# 切换到baidu-frame
driver.switch_to.frame('baidu-frame')
time.sleep(1)
# 输入kw文案
driver.find_element_by_css_selector('#kw').send_keys('YYYY')
# 返回上一层frame,即top-frame
driver.switch_to.parent_frame()
# 清空top-frame的输入
driver.find_element_by_css_selector('#newtag').clear()
# 再切换到baidu-frame
driver.switch_to.frame('baidu-frame')
# 再清空baidu-frame的输入
driver.find_element_by_css_selector('#kw').clear()
# 切换到最外层frame
driver.switch_to.default_content()
# 输入i1文案
driver.find_element_by_css_selector('#i1').send_keys('NNNN')

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

例子:

 # 弹框处理
driver.find_element_by_css_selector('#confirm').click() # 点击按钮,弹出弹框
print(driver.switch_to.alert.text) # 打印弹框返回的文本文字
driver.switch_to.alert.accept() # 确认
driver.switch_to.alert.dismiss() # 取消

Select

  在UI自动化测试过程中,经常会遇到一些下拉框,如果我们基于Webdriver操作的话就需要click两次,而且很容易出现问题,实际上Selenium给我们提供了专门的Select(下拉框处理模块)。

 # 通过select选项的索引来定位选择对应选项(从0开始计数)
Select(s).select_by_index(5) # 通过选项的value属性值来定位
Select(s).select_by_value('') # 通过选项的文本内容来定位
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.webdriver.support.select import Select
driver.get('http://ui.imdsx.cn/html/')
driver.execute_script('window.scrollTo(0,1500);')
select = driver.find_element_by_xpath('//select[1]')
# 实例化select,接收一个select标签,如果不是select标签则抛异常
Select(select).select_by_value('') # 通过select标签的option中的value的值定位
Select(select).select_by_index('') # 通过select标签的option中的下标定位,从0开始

如果一个标签下还有子集,可以继续在这个标签小查找,如下:

 driver.get('http://ui.imdsx.cn/html/')
driver.execute_script('window.scrollTo(0,1500);')
select = driver.find_element_by_xpath('//select[1]')
# 获取select标签下所有的option的元素
options = select.find_elements_by_tag_name('option')
for opt in options:
print(opt.get_attribute('value')) # 循环获取select('//select[1]')标签下的option的value属性
print(opt.get_attribute('index')) # 循环获取select('//select[1]')标签下的option的下标

Selenium学习之==>Switch与SelectApi接口详解的更多相关文章

  1. Selenium-Switch与SelectApi接口详解

    Switch 我们在UI自动化测试时,总会出现新建一个tab页面.弹出一个浏览器级别的弹框或者是出现一个iframe标签,这时我们用WebDriver提供的Api接口就无法处理这些情况了.需要用到Se ...

  2. go语言学习之路六:接口详解

    Go语言没有类和继承的概念,但是接口的存在使得它可以实现很多面向对象的特性.接口定义了一些方法,但是这些方法不包含实现的代码.也就是说这些代码没有被实现(抽象的方法).同时接口里面也不包含变量. 看一 ...

  3. IP地址和子网划分学习笔记之《IP地址详解》

    2018-05-03 18:47:37   在学习IP地址和子网划分前,必须对进制计数有一定了解,尤其是二进制和十进制之间的相互转换,对于我们掌握IP地址和子网的划分非常有帮助,可参看如下目录详文. ...

  4. “全栈2019”Java第八十四章:接口中嵌套接口详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  5. “全栈2019”Java第八十三章:内部类与接口详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  6. JDBC常用接口详解

    JDBC中常用接口详解 ***DriverManager 第一.注册驱动 第一种方式:DriverManager.registerDriver(new com.mysql.jdbc.Driver()) ...

  7. ASP.NET MVC 5 学习教程:生成的代码详解

    原文 ASP.NET MVC 5 学习教程:生成的代码详解 起飞网 ASP.NET MVC 5 学习教程目录: 添加控制器 添加视图 修改视图和布局页 控制器传递数据给视图 添加模型 创建连接字符串 ...

  8. Java6.0中Comparable接口与Comparator接口详解

    Java6.0中Comparable接口与Comparator接口详解 说到现在,读者应该对Comparable接口有了大概的了解,但是为什么又要有一个Comparator接口呢?难道Java的开发者 ...

  9. socket接口详解

    1. socket概述 socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信. socket起源于UNIX,在Unix一切 ...

随机推荐

  1. Redis入门部署及持久化

    软件简介 软件说明 Redis是一款开源的,ANSI C语言编写的,高级键值(key-value)缓存和支持永久存储NoSQL数据库产品. Redis采用内存(In-Memory)数据集(DataSe ...

  2. iconv - 字符集转换

    总览 (SYNOPSIS) iconv [-f encoding] [-t encoding] [inputfile ...] 描述 (DESCRIPTION) iconv 程序 把 文本 从 一种 ...

  3. 从标准输入读取一行数组并保存(用的是字符串分割函数strtok_s() )

    首先介绍字符串分割函数: char *strtok_s( char *strToken, //字符串包含一个标记或一个以上的标记. const char *strDelimit, //分隔符的设置 c ...

  4. Linux目录的切换

    pwd:显示当前所在目录 ~:root目录 /:根目录 ls:查看当前目录下所有的文件和目录 cd usr 切换到该目录下usr目录 cd ../ 切换到上一层目录 cd / 切换到系统根目录 cd  ...

  5. Spring Framework Part1

    初识Spring 1.Spring是一个支持IOC(Inversion of Control),DI(Dependency Injection),AOP(Aspect Oriented Program ...

  6. Hash基础

    BKDR Hash: 选取恰当的进制,可以把字符串中的字符看成一个大数字中的每一位数字,不过比较字符串和比较大数字的复杂度并没有什么区别 首先不要把任意字符对应到数字0,比如假如把a对应到数字0,那么 ...

  7. Ubuntu利用ROS搭建手机移动网络摄像头(Android)

    所需设备 PC -> Ubuntu 16.04 - > ROS Kinetic Android系统手机 1.Android移动端APP下载安装 配置手机端:(一般默认即可RTSP) 2.源 ...

  8. Codeforces Round #593 (Div. 2) C. Labs A. Stones

    题目:https://codeforces.com/contest/1236/problem/A 思路:两种操作收益都是3 且都会消耗b 操作2对b消耗较小 则可优先选择操作2 再进行操作1 即可得到 ...

  9. Error: unable to perform an operation on node 'rabbit@DESKTOP-6JT7D2H'. Please see diagnostics information and suggestions below.

    https://blog.csdn.net/qq_32814555/article/details/79494533

  10. MyEclipse使用教程:unattended安装

    [MyEclipse CI 2019.4.0安装包下载] 以下内容适用于2013及以上版本. 运行无提示安装程序 1. 创建一个unattended response文件. 2. 要激活unatten ...