Selenium WebDriver API 学习笔记(三):浏览器控制

读了虫师《Selenium 2自动化测试实战 基于Python语言》一书,感触颇深,内容非常丰富。现整理下来,供后续学习参考使用。本次主要整理的是元素浏览器控制之二。内容在“Selenium WebDriver API 学习笔记(二):浏览器控制”基础上添加。

9.设置元素等待

①显式等待:WebDriverWait(driver,poll_fequency=0.5,ignored_exceptions=None)
②隐式等待:driver.implicitly_wait(time) time可自定义
③sleep休眠:sleep(time)  time可自定义

10.定位一组元素

在之前定位单个元素的element后加s
find_elements_by_id();      		
find_elements_by_name();   		
find_elements_by_class_name();  	
find_elements_by_tag_name();     	
find_elements_by_link_text();     	
find_elements_by_partial_link_text();  	
find_elements_by_xpath();  
find_elements_by_css_selector();	

11.多表单切换

driver.swtich_to.frame()

12.多窗口切换

driver.switch_to.widow()  用于切换到相应的窗口
current_window_handle  获取当前窗口句柄
window_handles   返回所有窗口的句柄到当前会话

13.警告框处理

text:返回 alert/confirm/prompt中的文字信息
accept(): 接受现有警告框
dismiss(): 解散现有警告框
send_keys(keysToSend): 发送文本至警告框

14.上传文件

普通上传:将本地文件的路径作为一个值放在input标签中,通过form表单将这个值提交给服务器

插件上传:指基于Flash,JavaScript或Ajax等技术实现上传功能

①send_keys()
如:
from selenium import webdriver
import os

driver = webdriver.Chrome()
file_path='file:///' + os.path.abspath('upfile.html')
driver.get(file_path)
#定位上传按钮,添加本地文件
driver.find_element_by_name("file").send_keys('D:\\upload_file.txt')
driver.quit()
②AutoIt实现上传  下载使用http://www.autoitscript.com/site/

15.下载文件

from selenium import webdriver
import os
fp=webdriver.Firefoxprofile()
fp.set_preference("browser.download.folderList",2)#0是默认路径,2是指定路径
fp.set_preference("browser.download.manager.showWhenStarting",False)#是否显示开始
fp.set_preference("browser.download.dir",os.getcwd())#用于指定所下载的文件的目录
fp.set_preference("browser.helperApps.neverAsk.saveToDisk","application/octet-stream")#下载文件的类型
driver=webdriver.Firefox(firefox_profile=fp)
driver.get("http://pypi.Python.org/pypi/selenium")
driver.find_element_by_partial_link_text("selenium-2").click()

16.操作Cookie

WebDriver操作cookie的方法:
get_cookies(): 获取所有的cookie信息
get_cookie(name): 返回字典的key为“name”的cookie信息
add_cookie(cookie_dict):添加cookie。cookie_dict为字典对象,必须有name,value值
delete_cookie(name,optionsString):删除cookie信息
delete_all_cookies():删除所有的cookie信息

17.调用JavaScipt

调整浏览器滚动条位置
window.scrollTo(左边距,上边距)

18.处理HTML5的视频播放

load(),play(), pause()   加载,播放,暂停

19.窗口截图

driver.get_screenshot_as_file("D:\\xxxxx")#截取当前窗口,并指定截图图片的保存位置

20.关闭窗口

quit():退出相关程序和关闭所有窗口;
close():关闭当前窗口

21.验证码的处理

①去掉验证码
②设置万能验证码
③验证码识别技术
④记录cookie
本文转载于网络 如有侵权请联系删除

相关文章

  • 如何在MySQL数据库中创建新表

    如何在MySQL数据库中创建新表,以下为操作演示。:CREATETABLE语法:REATETABLE[IFNOTEXISTS]table_name( column_list )engine=table_type;复制[IFNOTEXISTS]主要是用于判定新建的表是否存在 engine需要指定存储引擎。可以使用任何存储引擎,如:InnoDB,MyISAM,HEAP,EXAMPLE,CSV,ARCHIVE,MERGE,FEDERATED或NDBCLUSTER。如果不明确声明存储引擎,MySQL将默认使用InnoDB。 column_list较为复杂,为指定表的列表。字段的列用逗号(,)分隔。 column_list的语法如下:column_namedata_type[size][NOTNULL|NULL][DEFAULTvalue][AUTO_INCREMENT]复制column_name指定列的名称。每列具有特定数据类型和大小,例如:varchar(50)。 NOTNULL或NULL表示该列是否接受NULL值。 DEFAULT值用于指定列的默认值。 AUTO_INCRE

  • matlab与FPGA数字滤波器设计(5)—— Verilog 串行 FIR 滤波器

    在FPGA实现FIR滤波器时,最常用的是直接型结构,简单方便,在实现直接型结构时,可以选择串行结构/并行结构/分布式结构。串行结构即串行实现FIR滤波器的乘累加操作,数据的处理速度较慢。N阶串行FIR滤波器,数据的输入速率=系统处理时钟速率/滤波器长度(N+1),本例使用7阶串行,系统时钟32MHz,这样数据的输入速率(也是采样速率)为4MHz;7阶串行FIR滤波器结构框图如下图所示,只使用一个乘法器,按照输入顺序依次串行使用该乘法器,输入信号为0.5MHz叠加1.8MHz信号,采样时钟为4MHz(系统处理时钟频率/滤波器阶数)16-bit量化;滤波器系数8-bit量化,4MHz抽样,低通滤波器(LowPassFilter,LPF),截止频率1MHz,窗函数设计,Blackman窗;输出信号为0.5MHz信号,16-bit截位;1.新建工程和文件(1)新建Verilog文件,输入信号16-bit,输出信号16-bit,复位rst_n低电平进行复位;(2)定义x0~x8并赋值;在数据输入时钟data_clk的上升沿进行数据的移位操作,低电平复位时初始化x0~x8均为0,rst_n为高电平

  • HDOJ(HDU) 1563 Find your present!(异或)

    ProblemDescription Inthenewyearparty,everybodywillgeta“specialpresent”.Nowit’syourturntogetyourspecialpresent,alotofpresentsnowputtingonthedesk,andonlyoneofthemwillbeyours.Eachpresenthasacardnumberonit,andyourpresent’scardnumberwillbetheonethatdifferentfromalltheothers.Forexample,thereare5present,andtheircardnumbersare1,2,3,2,1.soyourpresentwillbetheonewiththecardnumberof3,because3isthenumberthatdifferentfromalltheothers.Input Theinputfilewillconsistofseveralcases. Eachcasewillbepresentedbyanint

  • 系列篇|三维重建之纯格雷码三维重建

    对于新手来说,使用格雷码做单目结构光三维重建是一个入门级的训练。但是在复现时往往会遇到一个问题,明明解码都很不错了,重建后的点云精度却很低,甚至重建出来的平面点云出现断层现象。这是由于格雷码是一种离散型编码,编码精度是整数级的像素,这种编码设计注定了它的精度不会太高。所以在实际应用中,格雷码通常是配合着其他编码方式一起使用:比如使用格雷码来标示相移的周期数。尽管如此,由于格雷码本身的特性,稳定性高,抗反光效果比较好,在精度需求不是特别高的情况下,还是有适用场景的。尤其是景深范围大的时候,相位很容易出现模糊,可是对于黑白条纹的格雷码适应的景深就能够大一些。本文就简单介绍下如何使用纯格雷码进行三维重建,并得到一个精度尚可的点云(至少不出现重建平面时明显断层/分层现象)。从解决问题的本身出发,想要得到一个精度比较不错的点云,最直观的思路是解码时得到一个准确的亚像素级精度,比如像相移那样,但是对于格雷码而言,很难去给出一个很好的插值函数去获得一个亚像素级的匹配,实际上,如果以图片某一行为例,你得到的解码结果可能是16,16,17,17,18,18,18,NaN,NaN,21…对于这样排列的解码

  • Linux Lab v0.5 正式发布,功能强大,用法简单

    LinuxLab是一套用于Linux内核学习、开发和测试的即时实验室,可以极速搭建和使用,功能强大,用法简单! 可以用它来高效地学习处理器架构、Linux内核、嵌入式Linux系统、C语言编程、Linux汇编、Shell编程等。LinuxLabBootexample版本更新LinuxLab于6月底发布了v0.5的第一个候选版本:v0.5-rc1,经过三个月的开发和迭代,在连续发布了rc2,rc3后,本次发布v0.5正式版本,同步发布配套的Lab管理工具CloudLabv0.3和首个LinuxLab视频公开课,更多用法将逐步以视频讲解+演示的方式发布,敬请期待。本次主要是把开发环境升级到了Ubuntu20.04并添加了龙芯全系处理器支持。本次合计204笔变更://linuxlab $gitlog--pretty=onelinev0.4..v0.5|wc-l 144 //cloudlab $gitlog--pretty=onelinev0.2..HEAD|wc-l 60 复制本次有4位同学发起了PR并被Merge,另有接近10位同学提报或验证了Bug,感谢大家的贡献:$gitlog--fo

  • JavaScript之我在正则表达式里踩的坑

    在学习正则表达式的时候,突然翻车,代码如下:varstr="VisitRunoob!"; varstr1="/noo/i"; document.write(str.search(str1));复制以为就是走个流程,然而懵了:输出结果是-1. 半天也没找出错在哪里。 然后误打误撞下整出了下面的代码:varstr="VisitRunoob!"; varstr1=/noo/i; document.write(str.search(str1));复制咦,我又懵了,怎么居然就对了呢 搞了很久,才找到原因:str1是个对象,不是字符串,所以不能用引号引起来。不对,那为什么菜鸟教程上的代码能用引号,如下:<script> varstr="VisitRunoob!"; varn=str.search("Runoob"); document.write(n); </script>复制 不是说search()、replace()可以使用字符串吗?怎么有时就不行了呢仔细对比了代码,发

  • mysql派生查询必须有别名问题记录

    版权声明:本文为博主原创文章,遵循CC4.0BY-SA版权协议,转载请附上原文出处链接和本声明。本文链接:https://blog.csdn.net/u014427391/article/details/100545991最近在做mysqlsql兼容,原来是oracle的sql都要保证在mysql数据库运行 业务场景:原来是一个带有子查询的sql,在oracle是可以正常运行的,迁到mysql就发现报错了,报错信息如:Everyderivedtablemusthaveitsownalias 这个报错的意思是,派生出来的查询结果必须有一个别名,比如SQL:select*from(selecta.id,a.namefromA)limit0,1复制或者selectcount(1)from(selecta.id,a.namefromA)复制等等查询在oracle都是正常的,但是在mysql都会报错,解决方法就是给子查询加个别名select*from(selecta.id,a.namefromA)tlimit0,1复制或者selectcount(1)from(selecta.id,a.namef

  • 裸盘存储引擎的实现(一)

    导读:如何打开、读写块设备。如何知道块设备大小以及设备属性?什么是裸盘存储引擎单机存储引擎负责高效的组织数据、索引数据、保存数据,为上层应用提供易用的接口。有一类存储引擎为了得到更高的性能,会跨过文件系统这一层调用,直接操作裸盘。那么如何实现这类存储引擎呢?本文希望以CephBlueStore为例子,介绍一下其中的实现方法。怎么实现一个裸盘存储引擎读写块设备裸盘对于操作系统来说,就是一个类型为block的文件,也称之为块设备。在BlueStore的实现中,对于块设备作了一个抽象,声明了一个基类BlockDevice,并实现了两个子类KernelDevice和NVMEDevice,来分别对应普通的块设备以及NVMe块设备。在KernrlDevice::open方法中,包含了打开块设备以供读写的实现。open(path.c_str(),O_RDWR|O_DIRECT);复制通过阅读代码可以知道,BlueStore使用DirectIO加上libaio的方式来进行读写操作。使用O_DIRECT是为了跨过pagecache的影响,所有的存储与缓存逻辑都由我们自己实现。使用aio是因为用了O_DI

  • Java static 静态方法 并发(是否线程安全)

    publicclassTestUitl{ publicstaticUsersetName(Useruser,Stringname){ Useru=user; u.name=name; returnu; } }复制如上面的代码所示,在 setName 这个static方法里面u会不会有线程安全问题呢?答案是不确定的,为什么呢?首先说明一点,方法属于一个程序块,只有当别人调用它时才会调到内存里面去执行,也就是说当前有多少个线程在执行就有多少组方法块里的局部变量 (当然无论是静态方法还是实例方法,在内存中都只有一份代码,也就是只占用一份内存空间)我们继续来说回上面的问题,那u这个变量到底是不是线程安全的呢?答案不取决与是否为静态方法,而在于传进来的user,如果传进来的user属于共享变量或者是同一个User变量,那u也不是线程安全的,如果user都是独立变量,那u也就不用担心线程安全的问题。在web开发中,我们的servlet,struts2都是属于线程安全的,所以我们在使用静态方法处理业务时是不用担心并发的问题

  • java多线程下如何调用一个共同的内存单元(调用同一个对象)

    1/* 2*关于线程下共享相同的内存单元(包括代码与数据) 3*,并利用这些共享单元来实现数据交换,实时通信与必要的同步操作。 4*对于Thread(Runnabletarget)构造方法创建的线程,轮到它来享用CPU资源时。 5*目标对象就会自动调用接口中的run()方法 6**/ 7 8/*----------------举例子-------------------*/ 9 10/* 11*使用Thread类创建两个模拟猫和狗的线程,猫和狗共享房屋中的一桶水,即房屋是线程的目标对象 12*,房屋中的一桶水被猫和狗共享。猫和狗轮流喝水(狗大喝水多,猫小喝水少),当谁被喝尽时,猫和狗进入 13*死亡状态,猫和狗进入死亡状态。猫和狗在轮流喝水的过程中,主动休息片刻(让THread类调用Sleep(intn)) 14*进入中断状态),而不是等到被强制中断喝水。 15**/ 16packageDEMO; 17 18publicclassEXample12_3{ 19 20publicstaticvoidmain(Stringargs[]) 21{ 22Househouse=newHouse(

  • JAX介绍和快速入门示例

    点击上方“DeephubImba”,关注公众号,好文章不错过! JAX是一个由Google开发的用于优化科学计算Python库:它可以被视为GPU和TPU上运行的NumPy,jax.numpy提供了与numpy非常相似API接口。它与NumPyAPI非常相似,几乎任何可以用numpy完成的事情都可以用jax.numpy完成。由于使用XLA(一种加速线性代数计算的编译器)将Python和JAX代码JIT编译成优化的内核,可以在不同设备(例如gpu和tpu)上运行。而优化的内核是为高吞吐量设备(例如gpu和tpu)进行编译,它与主程序分离但可以被主程序调用。JIT编译可以用jax.jit()触发。它对自动微分有很好的支持,对机器学习研究很有用。可以使用jax.grad()触发自动区分。JAX鼓励函数式编程,因为它是面向函数的。与NumPy数组不同,JAX数组始终是不可变的。JAX提供了一些在编写数字处理时非常有用的程序转换,例如JIT.JAX()用于JIT编译和加速代码,JIT.grad()用于求导,以及JIT.vmap()用于自动向量化或批处理。JAX可以进行异步调度。所以需要调用.bl

  • Pytest+allure+requests接口自动化

    实现功能 测试数据隔离:测试前后进行数据库备份/还原 接口直接的数据依赖:需要B接口使用A接口响应中的某个字段作为参数 对接数据库:讲数据库的查询结果可直接用于断言操作 动态多断言:可(多个)动态提取实际预期结果与指定的预期结果进行比较断言操作 自定义扩展方法:在用例中使用自定义方法(如:获取当前时间戳...)的返回值 邮件发送:将allure报告压缩后已附件形式发送 企业微信推送:搭配jenkins发送allure测试报告地址 钉钉推送:搭配jenkins发送allure测试报告地址 接口录制:录制指定包含url的接口,生成用例数据 目录结构 ├─api │└─client.py #请求封装 ├─backup_sqls │└─xxx.sql #数据库备份文件 ├─config │└─config.yaml #配置文件 ├─data │└─test_data.xlsx #用例文件 ├─log │└─run...x.log #日志文件 ├─report │├─data │└─html #allure报告 ├─test │├─conftest.py #依赖对象初始化 │└─te

  • Log system architecture

    0.技术选型参考 1.Collector Keywords:Collector,Processor 名称 Beats Fluentd-bit Introduction Beatsareacollectorandprocessoroflightweight(resourceefficient,nodependencies,small)andopensourcelogshippersthatactasagentsinstalledonthedifferentserversinyourinfrastructureforcollectinglogsormetrics. FluentBitwasborntoaddresstheneedforahighperformanceandoptimizedtoolthatcancollectandprocessdatafromanyinputsource,unifythatdataanddeliverittomultipledestinations. Owner Elastic TreasureData OpenSource Tru

  • 【LeetCode】二叉树的最近公共祖先(2)

    (一)二叉搜索树的最近公共祖先 题目(Easy):235.二叉搜索树的最近公共祖先 题目描述: 给定一个二叉搜索树,找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树T的两个结点p、q,最近公共祖先表示为一个结点x,满足x是p、q的祖先且x的深度尽可能大(一个节点也可以是它自己的祖先)。” 例如,给定如下二叉搜索树:root=[6,2,8,0,4,7,9,null,null,3,5] 如图所示: 示例1: 输入:root=[6,2,8,0,4,7,9,null,null,3,5],p=2,q=8 输出:6 解释:节点2和节点8的最近公共祖先是6。 复制 示例2: 输入:root=[6,2,8,0,4,7,9,null,null,3,5],p=2,q=4 输出:2 解释:节点2和节点4的最近公共祖先是2,因为根据定义最近公共祖先节点可以为节点本身。 复制 解题思路:   首先注意本题的限定条件是二叉搜索树(BST),其性质简单来说就是“左小右大”。   因此,本题主要的思路是:(1)p和q分别在左右子树上,则最近祖先为根;(2)若p和q都在左子树或右子

  • netty-socketio之BroadcastOperations

    最近用到了netty-socketio。之前对这个了解比较少,对netty了解比较多,看代码的时候,发现二者不是一个东西(废话)。 主要让我比较惊讶的区别是BroadcastOperations这个东西。 让我感觉这个东西是一个面向聊天室的应用框架。 首先SocketIOClient有一个joinRoom(Stringvar1)的方法。 框架里直接实现了假如聊天室的方法? namespace和room的概念其实用来同一个服务端socket多路复用的。namespace,room和socketio的关系如下。 socket会属于某一个room,如果没有指定,那么会有一个default的room。这个room又会属于某个namespace,如果没有指定,那么就是默认的namespace/ 这个机制可以实现对某个ROOM发送消息(EVENT)。他和之前的handler不是一个模式。

  • navicate连接宝塔宝塔数据库

    第一步:如图所示,需要从数据库修改权限,条件修改为允许所有人或者你电脑本机IP(指定IP)都可以; 第二步:选择“安全”,设置放行端口,将3306填入第一个对应位置,后面自己写备注,然后点击“放行”按钮即可,也可以指定范围,如3000:3500。 以上操作完成之后,最好返回首页重启一下MySQL,然后重新回到Navicat,输入相关配置信息,连接测试即可成功 此方法不一定针对所有的状况都可以解决,本文章只针对端口是否放行。可能还有MySQL数据库没有给root账号权限,请进入MySQL数据库授权。 #授权root用户对所有数据库在任何ip都可以进行操作 grantallon*.*toroot@'%'identifiedby'123456'withgrantoption; #刷新数据库 flushprivileges; 复制

  • EBS:已知科目组合ID,查询科目组合值

    使用以下两函数就可以不需要外关联 GL_CODE_COMBINATIONS表来组合科目代码值或科目描述。 已知科目组合ID(CCID),查询科目组合值 --已知科目组合ID返回科目组合值,如:108.0.140321.0.0.0.0.0.0 selectfnd_flex_ext.get_segs(application_short_name=>'SQLGL',--INVARCHAR2, key_flex_code=>'GL#',--INVARCHAR2, structure_number=>50368,--INNUMBER,--CHART_OF_ACCOUNT_ID combination_id=>2568265--INNUMBER--code_Combination_id )ASCONCATENATED_SEGMENTS fromdual; --返回复制 108.0.140321.0.0.0.0.0.0'复制 --已知科目组合,返回科目组合ID(CODE_COMBINATION_ID) selectfnd_flex_ext.get_ccid(ap

  • JavaScript实现按字典排序进行md5加密, 以及个人在小程序也可以实现

    // utils.js文件   constmd5=require('../md5.js')   functioncreatheaderkey(obj){     letdid=Math.ceil(Math.reandom()*10) //随机数     lettime1=newDate().getTime() //时间毫秒数     lettime=(time1+'').slice(0,-3) //截取前十位     letappType='wechatApp'     letinit= {       'app-type':arrType,       'did':did,       'time':time     }     //2.1 先把对象合并成一个对象     letinit=Object.assign({},init,obj}  //init函数内部的对象 obj 外部传进来的对象 得到一个新的对象     //===  Object.ass

  • 利用paramiko将服务器的文件批量匹配并下载到本地

    GitHub地址:https://github.com/xiaonancheng/paramiko- 利用利用paramiko将服务器的文件批量匹配并下载到本地,详情查看GitHub。

  • 小球拖动吸附

    前段时间,登录起点的移动站,发现上面的'最近阅读',小球很有意思 自己辛辛苦苦研究了两个小时,终于做出来了类似的效果,却发现人家的效果远没有那么简单,当拖住小球用力一扔,小球会有惯性效果,并且碰到边缘进行回弹,最后才会吸附到边缘,心头一颤,好牛逼啊,真是不看不知道,一看吓一跳(其实,这个功能估计没几个人知道,苦逼的程序员,做出来的效果都没几个人发现,要不是老子心细来研究一下,就错过了),我就在想,惯性这个情况怎么来判断,又怎么实现,情不自禁的将手伸到网上,一捞,果然有一篇帖子<开源移动端元素拖拽惯性弹动以及下拉加载两个JS>,打开一看,我了个天,你大爷的,竟然已经有大神模仿出来了起点上的效果,还封装好贴起来了,当时心里一万头草泥马跑过,真是 早知道有这东西,我还写个屁啊....泪流满面,写也就写了,还没人家写的好,真扯淡,心一横,研究一下. 先贴一下最初的写好的版本... <divclass="i-pendant"id="pendant"></div>复制 .i-pendant{ width:60px; height:60px; borde

  • 莫队、带修莫队、树上莫队详解

    这几天学习了莫队算法,试着写一篇比较详细的莫队教程吧... 普通莫队 简介 莫队是一种基于分块思想的离线算法,用于解决区间问题,适用范围如下: 只有询问没有修改。 允许离线。 在已知询问\([l,r]\)答案的情况下可以\(O(1)\)得到\([l,r-1],[l,r+1],[l-1,r],[l+1,r]\)的答案。 满足以上三个条件就可以在\(O(n\sqrt{m}+mlogm)\)的时间复杂度下得到每个询问的解。 算法思想 莫队的精髓就在于通过对询问进行排序,并把询问的结果作为下一个询问求解的基础,使得暴力求解的复杂度得到保证。 上文中“适用范围”的第三点“在已知询问\([l,r]\)答案的情况下可以\(O(1)\)得到\([l,r-1],[l,r+1],[l-1,r],[l+1,r]\)的答案”即是“把询问的结果作为下一个询问求解的基础”的方法。 例:[国家集训队]小Z的袜子 在这题中,用\(cnt_i\)表示当前处理的区间内颜色为i的袜子出现的次数,用\(\mathrm{len}\)表示当前处理的区间的长度,用\(x\)表示新增的那只袜子的颜色。 以已知区间\(

相关推荐

推荐阅读