html页面的iframe的切换:

  • iframe框架在html页面:实际就是多个html页面的相互嵌套;如果存在多个,则操作对象一直停留在主文档页面;    如果需要操作子文档页面则需要实现iframe的切换操作;
  •  驱动器对象.switch_to.frame(iframe的id/name/定位的对象)如果iframe中不存在id、不存在name的属性的话,则可以通过其他方式定位该iframe ,定位到的对象直接传入到参数中即可
  • 在实际过程中,一定注意多级iframe的切换以及并级的iframe切换,这两者切换的方式是完全不同的;
  • 可以通过driver.switch_to.default_content() :切换到主文档界面  driver.switch_to.parent_frame()切换到上一级父级iframe
  • 当如果两个iframe并级存在主文档的话那么两个方法调用的结果实际是等价的
  • 注意:如果当前的iframe框架对象窗口进行关闭操作后,那么驱动器对象会回到上一级父iframe的操作窗口上;当然如果在实际开发过程中存在多级iframe而iframe关闭后不清楚其处于的状态,则可以每关闭一个iframe全部重新回到主文档iframe状态;

下拉列表框的操作:

  • 1.直接定位,直接根据option中的属性进行定位
  • 2.二次定位
  • 3.Select对象定位方式:使用该种方式需要引入模块:from selenium.webdriver.support.select import Select
  1. 需要传入一个参数,该参数必须是一个Select(下拉列表看的标签)的标签对象;
  2. select_by_index:表示的是所有option的索引,并不是对应的option中的id值;
  3. select_by_value:表示的是option中的value属性所对应的值;
  4. select_by_visiable_text:表示的是标签外的文本内容;
  5. 注意:以上三个方法执行后直接选择指定的值,不需要在进行调用click方法;
  • 4.可以通过键盘的上下键完成选择

键盘操作:如果需要操作键盘事件的话则需要导入键盘模块,键盘模块导入方式

  • from selenium.webdriver.common.keys import Keys

  • #退格操作
    get_webdriver.find_element(By.ID,'company').send_keys(Keys.BACK_SPACE*3)
    #全选
    get_webdriver.find_element(By.ID,'company').send_keys(Keys.CONTROL,"a")
    #复制
    get_webdriver.find_element(By.ID,'company').send_keys(Keys.CONTROL,"c")
    #粘贴
    get_webdriver.find_element(By.ID,'linkman').send_keys(Keys.CONTROL,"v")

   #滚动

   get_webdriver.find_element(By.NAME,value='area').send_keys(Keys.ARROW_UP*2)

鼠标操作:如果需要操作鼠标事件的话则需要导入鼠标模块,鼠标模块导入方式:

  • 单击操作、鼠标悬浮操作、双击(有些功能需要双击才能够实现)
  • #单击
    ActionChains(get_driver).click(get_driver.find_elements(By.CLASS_NAME,'c-font-normal')[0]).perform()
  • #悬浮
    print(get_driver.find_elements(By.NAME,value='tj_settingicon')[1])
    time.sleep(2)
    ActionChains(get_driver).move_to_element(get_driver.find_elements(By.NAME,value='tj_settingicon')[1]).perform()
  • #双击操作
    get_driver.find_element(By.ID,'kw').send_keys("测试")
    time.sleep(2)
    ActionChains(get_driver).double_click(get_driver.find_element(By.ID,'kw')).perform()
  • 注意:在使用鼠标事件的时候,一定要注意调用perfrom方法,如果不调用说明前面定义的动作并没有执行;

selenium的三种等待方式:在执行脚本的过程中,如果遇到页面数据过大,网络因素等情况导致元素加载过慢或者还未加载,而此时又在执行该行代码则会抛出元素无法找到等类型的异常信息;为了避免因为脚本执行过快而导致执行失败,所以会引入在脚本中进行设置脚本的执行速度

  • 1.强制等待:又称为强制休眠;该方式只能够作用于当前行的脚本的休眠操作;那么如果存在多行则需要每行进行设置休眠操作,此种方法则容易造成大量的重复代码,并且使得代码的走读性降低;直接使用python内置模块的time模块,调用sleep方法即可;该方式最大的缺点就是:影响代码的执行速度(设定的代码休眠时间不能够精确,设定过长时间则一定要等到所设定的时间,如果元素在设定时间值之前就加载完毕则浪费时间)
  • 2.隐式等待:又称为智能等待,也称之为全局等待;表示的是针对整个当前页面中的所有元素加载完毕后才会进行执行;如果加载在设定的时间之前加载完毕则后续时间不会等待直接执行;一般脚本在实际设定该部分时间范围为5-30s之间;如果加载在设定的时间内之前加载完毕则后续时间不会等待直接执行;一般脚本在实际设定该部分时间范围为5-30s之间; 调用直接通过驱动器对象调用implicitly_wait(20);作用于整个脚本生命周期;
  • 隐式等待的弊端:因为只针对的是整个页面 如果页面不同元素直接存在依赖就无法实现
  • 3.显示等待:主要是针对单个元素进行设定一定的频率刷新当前页面并检测是否存在该元素;
  • 导入模块:
  • from selenium.webdriver.support.ui import WebDriverWait
  • from selenium.webdriver.support.wait import WebDriverWait
  • 说明:ui模块中的webdiverwait就是调用support.wait中的webdriverwait
  • WebDriverWait该类需要传入四个参数:第一个参数表示的是:当前驱动器对象;第二个参数表示的是:设定刷新页面的超时时间;第三个参数表示的是刷新的频率;第四个参数表示的是:设定如果页面无法找到元素的异常类型对象,如果没有定义为默认值的话则抛出的是NosuchElementException;
  • Webdriverwait对象中只存在两个方法: until,until_not,在until和until_not两个方法中需要传入一个参数:该参数是method;method传入的对象只能够是两种:一种是匿名函数,另一种预置条件对象(excepted_conditions)
  • 简单实例:
  • 打印效果:

    如果找不到的话:

  • 说明:在实际工作中,使用隐式等待和显示等待频率是最高的;

  • python内置方法:__call__方法:表示的是对象可直接使用函数的形式进行调用方法;不需要通过对象进行调用具体的方法(相对简单方便);如果没有声明该方法则对象不可直接函数方式使用;
  • 例如:
  • a()此句代码表示的是直接调用A类中显示声明的__call__方法

显示方法的实例展示:

demo:

WebDriver API及对象识别技术的更多相关文章

  1. 转:python webdriver API 之操作测试对象

    一般来说,所有有趣的操作与页面交互都将通过 WebElement 接口,包括上一节中介绍的对象定位,以及本节中需要介绍的常对象操作.webdriver 中比较常用的操作元素的方法有下面几个: cle ...

  2. Selenium WebDriver Api 知识梳理

    之前一直没有系统的梳理WebDriver Api的相关知识,今天借此机会整理一下. 1.页面元素定位 1.1.8种常用定位方法 # id定位 driver.find_element_by_id() # ...

  3. selenium2(WebDriver) API

    selenium2(WebDriver) API 作者:Glen.He出处:http://www.cnblogs.com/puresoul/  1.1  下载selenium2.0的包 官方downl ...

  4. python+selenium自动化软件测试(第2章):WebDriver API

    2.1 操作元素基本方法 前言前面已经把环境搭建好了,从这篇开始,正式学习selenium的webdriver框架.我们平常说的 selenium自动化,其实它并不是类似于QTP之类的有GUI界面的可 ...

  5. JedisCluster中应用的Apache Commons Pool对象池技术

    对象池技术在服务器开发上应用广泛.在各种对象池的实现中,尤其以数据库的连接池最为明显,可以说是每个服务器必须实现的部分.   apache common pool 官方文档可以参考:https://c ...

  6. 《精通Hibernate:Java对象持久化技术详解》目录

    图书信息:孙卫琴 电子工业出版社 第1章 Java应用分层架构及软件模型: 1.1 应用程序的分层体系结构 1.1.1 区分物理层和逻辑层 1.1.2 软件层的特征 1.1.3 软件分层的优点 1.1 ...

  7. .net中对象序列化技术浅谈

    .net中对象序列化技术浅谈 2009-03-11 阅读2756评论2 序列化是将对象状态转换为可保持或传输的格式的过程.与序列化相对的是反序列化,它将流转换为对象.这两个过程结合起来,可以轻松地存储 ...

  8. 转:python webdriver API 之 验证码问题

    对于 web 应用来说,大部分的系统在用户登录时都要求用户输入验证码,验证码的类型的很多,有字母数字的,有汉字的,甚至还要用户输入一条算术题的答案的,对于系统来说使用验证码可以有效果的防止采用机器猜测 ...

  9. Webdriver API (二)

    (转载) 1.3 打开测试页面 对页面对测试,首先要打开被测试页面的地址(如:http://www.google.com),web driver 提供的get方法可以打开一个页面: // And no ...

  10. Selenium2+Python:Webdriver API速记手册

    由于web自动化常常需要控制浏览器行为和操作页面元素,相关函数又比较多,于是再此记下一份Webdriver API查阅文档以备不时之需. 参考:虫师<Selenium2自动化测试实战>,和 ...

随机推荐

  1. mysql之数据表基本操作-第四篇

    在关系型数据库中,数据表是一系列二维数组的集合,用来存储数据和操作数据的逻辑结构. 1.创建表,以创建一个简单的员工表为例: create table employee ( empId INT(11) ...

  2. jmeter将接口返回写入log

    1.添加BeanShell 后置处理程序 2. //拿到响应值 String json = prev.getResponseDataAsString(); log.info("Value为: ...

  3. EBI数据库下载数据

    EBI网址链接: https://www.ebi.ac.uk 方法:直接从ncbi上面找到想要下载数据的SRR号然后去EBI里面直接搜索即可得到. 底部就是想要下载的fastq文件了: 然后右键复制链 ...

  4. 黑马 java.lang.IllegalArgumentException: Property ‘dataSource‘ is required

    现象: 按照教程步骤做的,但连单元测试都无法通过,会出现java.lang.IllegalArgumentException: Property 'dataSource' is required这个错 ...

  5. api接口基础Day2

    精华笔记: 正则表达式: 用于描述字符串的内容格式,使用它通常用于匹配一个字符串是否符合格式要求 正则表达式的语法:-------------了解.不用纠结.不用深入研究 1.[]:表示一个字符,该字 ...

  6. vue移动端登录与登录保持

    成品效果 首先进入首页点击右下角个人中心,若状态为登录中则进入个人中心页面,否则进入登录页 实现步骤 首先完成静态的登录页与个人中心页面 登录页 <template> <div cl ...

  7. Sql Server新建一个只读权限的用户

    1,新建只能访问某一个表的只读用户. --添加只允许访问指定表的用户: exec sp_addlogin '用户名','密码','默认数据库名' --添加到数据库 exec sp_grantdbacc ...

  8. Vue+SSM+Element-Ui实现前后端分离(2)

    前言:后台使用ssm搭建,对以前学习知识的一个回顾,与此同时来发现自己不足.这里主要采用配置文件方式进行,有部分注解. 目标:搭建ssm框架,并测试成功:(其中也有aop切面的编写) 一.开发工具 I ...

  9. 9.29 2020 实验 4:Open vSwitch 实验——Mininet 中使用 OVS 命令

    一.实验目的 Mininet 安装之后,会连带安装 Open vSwitch,可以直接通过 Python 脚本调用Open vSwitch 命令,从而直接控制 Open vSwitch,通过实验了解调 ...

  10. 新的世界,我们推荐不劳而获 -> 持续更新中

    随着技术带来的生产力爆发越来越猛烈,有人提出是不是有必要保留一些落后的生产工艺及相关岗位,以避免社会动荡. 我的答案:不用.但是要改变社会对于不劳而获的态度:我们对于生活资料的不劳而获持接受的态度,但 ...