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

读了虫师《Selenium 2自动化测试实战 基于Python语言》一书,感触颇深,内容非常丰富。现整理下来,供后续学习参考使用。本次主要整理的是浏览器控制操作之一。

1.控制浏览器窗口大小

set_window_size(); 
如set_window_size(640,480); 即宽640,高480

maximize_window(); 窗口最大化,不需要参数,直接使用

2.控制浏览器进退、前进

back(); 返回
forwar(); 前进
如 driver.back(); 其中driver=webdriver.Chrome()

3.模拟浏览器刷新

refresh(); 如driver.refresh()类似F5

4.简单元素操作

①clear(); 清除文本
②send_keys(*value); 模拟按键输入
③click(); 单击元素
举例:
driver.find_element_by_id("qwe").clear()
driver.find_element_by_id("qwe").send_keys("tyyu")
driver.find_element_by_id("login").click()

5.webelement接口常用方法

size:返回元素的尺寸
text:获取元素的文本
get_attributte(name):获得属性
is_displayed():设置改元素是否用户可见

举例:
size=driver.find_element_by_id("qwe").size    获取输入框的尺寸
text=driver.find_element_by_id("qwe").text    获取文本信息
attributte = driver.find_element_by_id("qwe").get_ attributte('type')  可以是id、name、type或其他任意属性
result= driver.find_element_by_id("qwe"). is_displayed()  返回元素的结果是否可见,返回结果为Ture或者False

6.鼠标事件

perform(): 执行所有ActionChains中存储的行为
context_click(): 右击
double_click(): 双击
drag_and_drop(element, target
move_to_element(): 鼠标悬停

举例:
①rom selenium.webdriver.common.action_chains import ActionChains   先引入ActionChains类
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
#...
#定位到要右击的元素
right_click = driver.find_element_by_id("qwe")
#对定位到的元素执行鼠标右击操作
ActionChains(driver).context_click(right_click).perform()
说明:
ActionChains(driver):调用这个类,将浏览器驱动driver作为参数传入
context_click(right_click):模拟邮件操作,在使用时需要指定元素定位
perfom():将指定所有ActionChains中存储的行为。
②above=driver.find_element_by_id("qwer")
ActionChains(driver).move_to_element(above).perfom()
其他方法类似

7.键盘事件

Keys类提供了键盘上所有的按键方法
from selenium.webdriver.common.keys import Keys
send_keys(Keys.BACK_SPACE)        删除键
send_keys(Keys. SPACE)				空格键
send_keys(Keys.TAB)				制表键
send_keys(Keys.ESCAPE)				回退键
send_keys(Keys.ENTER)				回车键
send_keys(Keys.CONTROL,'a')			全选
send_keys(Keys.CONTROL,'c')		复制
send_keys(Keys.CONTROL,'x')			剪贴
send_keys(Keys.CONTROL,'v')			粘贴
send_keys(Keys.F1)
...
send_keys(Keys.F12)				F1-F12

8.获得验证信息

title, URL, text
举例:
now_url=driver.current_url 获取当前页面URL
title=driver.title 获取当前页面title
text前边已经提及到,不赘述
本文转载于网络 如有侵权请联系删除

相关文章

  • 线程池执行execute()方法和submit()方法的区别是什么呢?

    1)execute()方法用于提交不需要返回值的任务,所以无法判断任务是否被线程池执行成功与否;2)submit()方法用于提交需要返回值的任务。线程池会返回一个future类型的对象,通过这个future对象可以判断任务是否执行成功,并且可以通过future的get()方法来获取返回值,get()方法会阻塞当前线程直到任务完成,而使用get(longtimeout,TimeUnitunit)方法则会阻塞当前线程一段时间后立即返回,这时候有可能任务没有执行完。publicclasscallThreadimplementsCallable{ intkey; publiccallThread(intkey){ this.key=key; } @Override publicIntegercall()throwsException{ returnkey; } }复制publicclassThreadCount{ staticvolatileinta=1; publicstaticvoidmain(String[]args)throwsExecutionException,Interrup

  • 如何优雅的实现 Spring Boot 接口参数加密解密?

    松哥原创的SpringBoot视频教程已经杀青,感兴趣的小伙伴戳这里-->SpringBoot+Vue+微人事视频教程1.开发加解密starter为了让我们开发的这个工具更加通用,也为了复习一下自定义SpringBootStarter,这里我们就将这个工具做成一个stater,以后在SpringBoot项目中直接引用就可以。首先我们创建一个SpringBoot项目,引入spring-boot-starter-web依赖:<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <scope>provided</scope> <version>2.4.3</version> </dependency> 复制因为我们这个工具是为Web项目开发的,以后必然使用在Web环境中,所以这里添加依赖时scope设置为prov

  • SpringBoot 深度调优,让你的项目飞起来!

    作者:星朝cnblogs.com/jpfss/p/9753215.html项目调优作为一名工程师,项目调优这事,是必须得熟练掌握的事情。在SpringBoot项目中,调优主要通过配置文件和配置JVM的参数的方式进行。一、修改配置文件关于修改配置文件application.properties。SpringBoot项目详细的配置文件修改文档https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html#common-application-properties其中比较重要的有:server.tomcat.max-connections=0#Maximumnumberofconnectionsthattheserveracceptsandprocessesatanygiventime. server.tomcat.max-http-header-size=0#Maximumsize,inbytes,oftheHTTPmessageheader. server.

  • [每日一题]报数

    结合前几天的题目,今天推出的依旧是个数组的问题,今天的是高级点的一题 题目描述有n人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位。输入初始人数n输出最后一人的初始编号样例输入3复制样例输出2复制PS:仁者见仁,智者见智!具体题解见C语言网1047题另外,有兴趣的同学还可以加入C语言网官方微信群,一起讨论C语言有找密码或者其他问题也可以到里面找相关人员解决 通过加小编:dotcppcom备注:C语言网昵称(需要先在C语言网注册哦)就让我们向着更加美好的明天加油!加油!加油!

  • Python使用Manager对象实现不同机器上的进程跨网络传输数据

    本文主要演示不同机器上的进程之间如何通过网络进行数据交换。(1)首先编写程序文件multiprocessing_server.py,启动服务器进程,创建可共享的队列对象。 frommultiprocessing.managersimportBaseManager fromqueueimportQueueq=Queue() classQueueManager(BaseManager): pass QueueManager.register('get_queue',callable=lambda:q)m=QueueManager(address=('',30030),authkey=b'dongfuguo') s=m.get_server() s.serve_forever()(2)然后编写程序文件multiprocessing_client1.py,连接服务器进程,并往共享的队列中存入一些数据。 frommultiprocessing.managersimportBaseManagerclassQueueManager(Base

  • 利用Lucene打造站内搜索引擎的思路

    1.为什么要用Lucene,而不用直接从数据库里搜索记录?主要是考虑到几个因素:(1)性能问题,Lucene是基于文件索引的搜索机制,性能要比数据库里检索更快,特别是数据量大的时候两者区别比较明显。数据库用Select检索时,默认在执行sql语句时,会对表锁定,直到查询完成;(2)目前很多网站,都已经将页面静态化,这种情况下,直接用生成的文件编制索引,再利用Lucene来检索,可以不用查询数据库,减轻了数据库的压力;(3)Lucene可以更方便的进行分词,支持多个关键字检查等操作,在实现上要比Sql方便;(4)直接基于文件系统的检索,不会有SQL注入风险2.创建索引基本上有二种思路,适用于不同的情况(1)如果网站本身就是静态化的,可以直接读取静态Html文件,来创建索引。注意:如果要实现特定标签的搜索(比如要按产品价格,产品编号,产品摘要,发布时间等精确搜索产品信息),在读取文件内容时,需要利用正则表达式对Html文件进行匹配分析,得到各个标签的值,再创建Field,加入Document,最后调用IndexWriter的相应方法创建索引(2)也可以直接从数据库里查询各标签的值,再按(1

  • 遍历bilibili网站视频信息

    在以上两篇文章中我们已经在腾讯云服务器上搭建好了Python爬虫环境了,下一步就是在云服务器上爬上我们的爬虫,抓取我们想要的数据:【腾讯云的1001种玩法】云服务器搭建Python环境【腾讯云的1001种玩法】云服务器搭建Python爬虫环境今天我们要抓去的目标网站是,国内最大的年轻人潮流文化娱乐社区:哔哩哔哩-(゜-゜)つロ干杯~-bilibiliB站自建站以来已经收纳了大约六百多万的视频,那么今天我们就写一个爬虫去征服这六百多万条视频信息。我们想抓取的就是上面的播放次数、评论数量、硬币数量以及收藏数量,接着我们开始。1、先分析首先第一步这些数据在哪里?我们第一个想到的就是在网页源码里面,于是我们查看源码,搜索相关信息。遗憾的是我们会发现,信息并不在源码中;紧接着我们打开chrome开发者工具查看请求信息。http://api.bilibili.com/archivestat/stat?callback=jQuery172011470242640208683_1488515896642&aid=8904657&type=jsonp&=1488515897422

  • 【心情随记】收拾屋子,整理心态

    这几天闲来无事便收拾屋子,该归类的归类,该丢弃的丢弃,该收藏的收藏。 经过一番折腾,屋子干净利索了许多,少了几分杂乱,多了几分舒心。 比起刻意调整心态,用这类潜移默化的方式效果更佳。 代码改变世界

  • SSDT and Shadow SSDT table

    参考:http://x86.renejeschke.de/html/file_module_x86_id_313.html http://msdn.microsoft.com/en-us/library/windows/hardware/ff553516(v=vs.85).aspx http://en.wikipedia.org/wiki/Model-specific_register    rdmsr(0x00000174)=0x00000000~0x00000008 rdmsr(0x00000175)=0x00000000~0xf7a1a000 rdmsr(0x00000176)=0x00000000~0x8053dad0    kd>dg0 PSiGrPrLo SelBaseLimitTypelzeanesngFlags ----------------------------------------------- 00000000000000000000<Reserved>0NbByNpNl00000000

  • Qt——组件位置随窗口变化

    当我们用QtDesigner设计界面时,有时会面临这样一个问题:需要在窗口指定位置放置组件,并且当窗口位置大小改变时,该组件相对其父对象的位置是不变的,如下面两幅图所示 ,首先看上面这幅图,注意button的位置,我们想让button一直停留在该位置,我们刚开始做的可能是在designer中将button直接拖到该位置,编译运行后正是我们想要的结果,但是当我们拖动窗口,使窗口尺寸变化后,发现button位置改变了,如下面那副图所示。发生这种情况的原因很简单,直接拖放button到界面中,不加任何布局情况下,button的位置是相对于整个桌面不变的,而当窗口背景图变化时,两者自然而然的就不匹配了。   解决这种问题的方法是将button加入到布局当中,我们知道布局共有3种方式:水平布局、垂直布局、棋盘布局;这三种布局方式都能够使组件在一定程度上保持其相对于父窗口的位置不变,但对于水平和垂直相对位置都要固定的问题来说,用棋盘布局无疑是相对方便的,棋盘布局即为QGridLayout,添加组件的代码大致如下: QGridLayout*layout=newQGridLayout;复制 layou

  • 欧拉路

    欧拉路径和欧拉回路欧拉路径:从某结点出发一笔画成所经过的路线叫做欧拉路径。欧拉回路:在欧拉路径的基础上又回到起点。a、凡是由偶点组成的连通图,一定可以一笔画成。画时可以把任一偶点为起点,最后一定能以这个点为 终点画完此图。  b、凡是只有两个奇点的连通图(其余都为偶点),一定可以一笔画成。画时必须把一个奇点为起点,另 一个奇点终点。 c、其他情况的图都不能一笔画出。(有偶数个奇点除以2便可算出此图需几笔画成。)     欧拉回路和欧拉路径的判断欧拉回路:无向图:每个顶点的度数都是偶数,则存在欧拉回路。有向图:每个顶点的入度都等于出度,则存在欧拉回路。欧拉路径:无向图:当且仅当该图所有顶点的度数为偶数或者除了两个度数为奇数外其余的全是偶数。有向图:当且仅当该图所有顶点出度=入度或者一个顶点出度=入度+1,另一个顶点入度=出度+1,其 他顶点出度=入度。   怎么求一条欧拉路呐? Fleury算法求欧拉路径: Fleury算法伪代码:   DFS(u): While(u存在未被删除的边e(u,v)) 删除边e(u,

  • AngularJS中转换响应内容

      从远程API获取到的响应内容,通常是json格式的,有时候需要对获取到的内容进行转换,比如去除某些不需要的字段,给字段取别名,等等。本篇就来体验在AngualrJS中如何实现。在主页面,还是从controller中拿数据。   <bodyng-app="publicapi"> <ulng-controller="controllers.View"> <ling-repeat="repoinrepos"> <bng-bind="repo.userName"></b> <spanng-bind="repo.url"></span> </li> </ul> </body>复制   以上,userName,url字段是从源数据中转换而来的,可能userName对应源数据中的fullName,可能源数据中有更多的字段。在AngularJS中,把module之间的关系梳理清楚是一种很好的习惯,比如按如下方式梳理:   angula

  • map的value不能取址问题

    1如果map的value是struct,则需要是指针类型,否则的话不能对结构体的某个字段单调赋值,只能整体赋值,因为map扩容的时候要变址 packagemain import"fmt" typepersonstruct{ namestring ageint sexstring } funcmain(){ s:=make(map[int]*person) s[1]=&person{"tony",20,"man"} fmt.Println(s[1]) s[1].name="tom" fmt.Println(s[1].name) }复制 ViewCode https://blog.csdn.net/qq_36431213/article/details/82805043

  • c++ inline内联函数

    引入内联函数的目的是为了解决程序中函数调用的效率问题,这么说吧,程序在编译器编译的时候,编译器将程序中出现的内联函数的调用表达式用内联函数的函数体进行替换,而对于其他的函数,都是在运行时候才被替代。这其实就是个空间代价换时间的i节省。所以内联函数一般都是1-5行的小函数。在使用内联函数时要留神: 1.在内联函数内不允许使用循环语句和开关语句; 2.内联函数的定义必须出现在内联函数第一次调用之前; 3.类结构中所在的类说明内部定义的函数是内联函数。   Tip:只有当函数只有10行甚至更少时才将其定义为内联函数。 定义:当函数被声明为内联函数之后,编译器会将其内联展开,而不是按通常的函数调用机制进行调用. 优点:当函数体比较小的时候,内联该函数可以令目标代码更加高效.对于存取函数以及其它函数体比较短,性能关键的函数,鼓励使用内联. 缺点:滥用内联将导致程序变慢.内联可能使目标代码量或增或减,这取决于内联函数的大小.内联非常短小的存取函数通常会减少代码大小,但内联一个相当大的函数将戏剧性的增加代码大小.现代处理器由于更好的利用了指令缓存,小巧的代码往往执行更快。

  • (转)走进AngularJs(六) 服务

    原文地址:http://www.cnblogs.com/lvdabao/p/3464015.html     今天学习了一下ng的service机制,作为ng的基本知识之一,有必要做一个了解,在此做个笔记记录一下。 一、认识服务(service)   服务这个概念其实并不陌生,在其他语言中如java便有这样的概念,其作用就是对外提供某个特定的功能,如消息服务,文件压缩服务等,是一个独立的模块。ng的服务是这样定义的: Angularservicesaresingletonsobjectsorfunctionsthatcarryoutspecifictaskscommontowebapps.   它是一个单例对象或函数,对外提供特定的功能。 首先是一个单例,即无论这个服务被注入到任何地方,对象始终只有一个实例。 其次这与我们自己定义一个function然后在其他地方调用不同,因为服务被定义在一个模块中,所以其使用范围是可以被我们管理的。ng的避免全局变量污染意识非常强。   ng提供了很多内置的服务,可以到API中查看http://docs.angularjs.org/

  • .NET 通过entity framework报数据库连接错误:ORA-01017: invalid username/password; logon denied

    如题,答案为:【ORA-01017】.NET程序连接数据库失败  转载文章内容如下: 遇到问题 使用C#/.NET开发的一个客户端程序,需要连接ORACLE数据库,使用Oracle.ManagedDataAccess配合上PetaPoco可以大大简化数据库的操作。 一次偶然的事件,遇到了以下错误: ORA-01017:invalidusername/password;logondenied在OracleInternal.ConnectionPool.PoolManager`3.Get(ConnectionStringcsWithDiffOrNewPwd,BooleanbGetForApp,CriteriaCtxcriteriaCtx,StringaffinityInstanceName,BooleanbForceMatch) 在OracleInternal.ConnectionPool.OraclePoolManager.Get(ConnectionStringcsWithNewPassword,BooleanbGetForApp,CriteriaCtxcriteria

  • ACM春季集训树上问题

     感觉树上问题的难度真的好大啊 LCA,倍增,生成树,树链剖分,唉好难 下面这道题写了好长时间,就是树链剖分+LCA,我写了两种方法不知道为什么有一种是RE和MLE了 真的好痛苦,调了好久的bug还没有调出来,emmmm我寻思问问大佬们了,希望斧正一下我的代码 在给出代码之前看了网课(洛谷的啦),emmm寻思总结一下喽: 先来回顾两个问题: 1,将树从x到y结点最短路径上所有节点的值都加上z 这也是个模板题了吧 我们很容易想到,树上差分可以以O(n+m)的优秀复杂度解决这个问题 2,求树从x到y结点最短路径上所有节点的值之和 lca大水题,我们又很容易地想到,dfsO(n)预处理每个节点的dis(即到根节点的最短路径长度) 然后对于每个询问,求出x,y两点的lca,利用lca的性质distance(x,y)=dis(x)+dis(y)-2*dis(lca)求出结果 时间复杂度O(mlogn+n) 现在来思考一个bug: 如果刚才的两个问题结合起来,成为一道题的两种操作呢? 刚才的方法显然就不够优秀了(每次询问之前要跑dfs更新dis) 树剖是通过轻重边剖分将树分割成多条链,

  • 细说Java历史

    ##1.Java的起源 20世纪90年代,硬件领域出现了单片式计算机系统,这种价格低廉的系统一出现就立即引起了自动控制领域人员的注意,因为使用它可以大幅度提升消费类电子产品(如电视机顶盒、面包烤箱、移动电话等)的智能化程度。为了抢占市场Sun公司在1991年成立了一个称为Green的项目小组,其目的是开拓消费类电子产品市场,例如,交互式电视、烤面包箱等。 Sun内部人员把这个项目称为“Stealth计划”后来改名为“Green”。由于C++的优势,考虑采用C++编写程序。但对于硬件资源极其匮乏的单片式系统来说,C++程序过于复杂和庞大,另外由于消费电子产品所采用的嵌入式处理器芯片的种类繁杂,如何让编写的程序跨平台运行也是个难题。最后,他们想要一种易于移植到各种设备上的平台。 在当时,比尔·乔伊提议SUN公司的工程师应该在C的基础上,开发一种面向对象的环境。最初,高斯林试图修改和扩展C的功能,他自己称这种新语言为C–,但是后来他放弃了。他将要创造出一种全新的语言,被他命名为“Oak”(橡树),以他的办公室外的树而命名。 至于这Oak怎么变成了Java? 因为商标搜索结果显示,Oak已被一

  • Nacos配置中心和服务的注册发现

    在上一篇中,我们已经把Nacos的集群搭建好了,那么既然已经搭建好了,就要在咱们的项目中去使用。Nacos既可以做配置中心,也可以做注册中心。我们先来看看在项目中如何使用Nacos做配置中心。 Nacos配置中心 在项目中使用Nacos做配置中心还是比较简单的,我们先创建SpringBoot项目,然后引入nacos-config的jar包,具体如下: <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> 复制 如果你不想使用SpringBoot默认的nacos-config版本,也可以指定版本号。 首先,我们进入到nacos的管理后台,第一步要创建命名空间,如图: 我们创建了user的服务配置,以后user相关的微服务都在这个命名空间中拉取配置。我们点击保存,命名空间的id会自动生成,这个id是十分重要的,我

  • NOIP2020 游记

    Day0 早上直接翘课,快乐 七点到机房开始颓,写了一道Div2C,顺便写了一篇题解水咕值,然后就十点了(什 于是从学校出发坐车去fz,坐了三个多小时才到 到了宾馆东西放了然后就去对面吃饭,吃完饭就快三点了,直接去十八中报到试机 话说感觉fz的中学都喜欢建一个大的楼梯,附中三中十八中三个考场都有 到了考场还不能进去,看起来比附中三中破烂一点 三点进去,试机的座位是最后一排,再往后是独立的几台Linux的机子 今年改成OJ提交,良心了许多,至少不会再出现jxdy提交错导致抱灵的问题了,和今年FJOI挺像 发现机子上竟然没有IDE,问工作人员,说用记事本(??? 几十分钟后发了个Dev-C++安装包下来,就写吧 后面的Linux机子坐着一位福一中的jxdy,膜就完事了(话说我对他最深的印象竟然是FJOI2020他在附中的小礼堂走了好多圈(大雾 试机题是FOI2019基础班的练习,没怎么看,随便写了个A+B和对拍就走了,跑得还挺快,比学校机房的垃圾电脑快多了( 回去手机没电了,充满,出去玩 最后一年NOIP,再把fz逛一遍,到处乱跑,九点半才回来,跑了整整12km( 竟然在地铁站遇到本校毕业

  • excel插入折线图

    选中数据插入折线图 设置图例、标题、数据标签样式 选中数据插入圆饼图,进行标题、标签、图例样式的设置

相关推荐

推荐阅读