前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >web自动化捕捉元素基本方法

web自动化捕捉元素基本方法

作者头像
测试小兵
发布2019-11-20 11:00:55
1.7K0
发布2019-11-20 11:00:55
举报
文章被收录于专栏:猪圈子猪圈子猪圈子

前言:前面已经把环境搭建好了,从这篇开始,正式学习selenium的webdriver框架。我们平常说的 selenium自动化,其实它并不是类似于QTP之类的有GUI界面的可视化工具,我们要学的是webdriver框架的API。

本篇主要讲如何用Python调用webdriver框架的API,对浏览器做一些常规的操作,如打开、前进、后退、刷新、设置窗口大小、截屏、退出等操作。


2.1.1 打开网页

1.从selenium里面导入webdriver模块 2.打开Firefox浏览器(Ie和Chrome对应下面的) 3.打开百度网址

2.1.2 设置休眠

1.由于打开百度网址后,页面加载需要几秒钟,所以最好等到页面加载完成后再继续下一步操作 2.导入time模块,time模块是Python自带的,所以无需下载 3.设置等待时间,单位是秒(s),时间值可以是小数也可以是整数

2.1.3 页面刷新

1.有时候页面操作后,数据可能没及时同步,需要重新刷新 2.这里可以模拟刷新页面操作,相当于浏览器输入框后面的刷新按钮

2.1.4 页面切换

1.当在一个浏览器打开两个页面后,想返回上一页面,相当于浏览器左上角的左箭头按钮。

2.返回到上一页面后,也可以切换到下一页,相当于浏览器左上角的右箭头按钮。

2.1.5 设置窗口大小

1.可以设置浏览器窗口大小,如设置窗口大小为手机分辨率540*960 2.也可以最大化窗口

2.1.6 截屏

1. 打开网站之后,也可以对屏幕截屏 2.截屏后设置指定的保存路径+文件名称+后缀

2.1.7 退出

1.退出有两种方式,一种是close;另外一种是quit。 2.close用于关闭当前窗口,当打开的窗口较多时,就可以用close关闭部分窗口。 3.quit用于结束进程,关闭所有的窗口。 4.最后结束测试,要用quit。quit可以回收c盘的临时文件。

掌握了浏览器的基本操作后,接下来就可以开始学习元素定位了,元素定位需要有一定的html基础。没有基础的可以按下浏览器的F12快捷键先看下html的布局,先了解一些就可以了。

2.1.8 加载浏览器配置

启动浏览器后,发现右上角安装的插件不见了,这是因为webdriver启动浏览器时候,是开的一个虚拟线程,跟手工点开是有区别的,selenium的一切操作都是模拟人工(不完全等于人工操作)。

&加载Firefox配置

有小伙伴在用脚本启动浏览器时候发现原来下载的插件不见了,无法用firebug在打开的页面上继续定位页面元素,调试起来不方便 。加载浏览器配置,需要用FirefoxProfile(profile_directory)这个类来加载,profile_directory既为浏览器配置文件的路径地址。

&一、遇到问题 1.在使用脚本打开浏览器时候,发现右上角原来下载的插件firebug不见了,到底去哪了呢? 2.用脚本去打开浏览器时候,其实是重新打开了一个进程,跟手动打开浏览器不是一个进程。 所以没主动加载插件,不过selenium里面其实提供了对应的方法去打开,只是很少有人用到。

&二、FirefoxProfile 1.要想了解selenium里面API的用法,最好先看下相关的帮助文档打开cmd窗口, 输入如下信息:

->python
->from selenium import webdriver
->help(webdriver.FirefoxProfile)
Help on class FirefoxProfile in module
selenium.webdriver.firefox.firefox_profile:
class FirefoxProfile(builtin.object)
|  Methods defined here:
|
|  init(self, profile_directory=None)
|      Initialises a new instance of a Firefox Profile
|    
|      :args:
|       - profile_directory: Directory of profile that you want to use.
|         This defaults to None and will create a new
|         directory when object is created.

2.翻译过来大概意思是说,这里需要profile_directory这个配置文件路径的参数 3.profile_directory=None,如果没有路径,默认为None,启动的是一个新的,有的话就加载指定的路径。

&三、profile_directory 1.问题来了:Firefox的配置文件地址如何找到呢? 2.打开Firefox点右上角设置>?(帮助)>故障排除信息>显示文件夹

3.打开后把路径复制下来就可以了: C:\Users\xxx\AppData\Roaming\Mozilla\Firefox\Profiles\1x41j9of.default

&四、启动配置文件 1.由于文件路径存在字符:\ ,反斜杠在代码里是转义字符,这个有点代码基础的应该都知道。 不懂什么叫转义字符的,自己翻书补下基础吧! 2.遇到转义字符,为了不让转义,有两种处理方式: 第一种:\ (前面再加一个反斜杠)

第二种:r”\"(字符串前面加r,使用字符串原型)

&五、参考代码:

# coding=utf-8from selenium import webdriver# 配置文件地址
profile_directory = r'C:\Users\xxx\AppData\Roaming\Mozilla
\Firefox\Profiles\1x41j9of.default'# 加载配置配置profile =
 webdriver.FirefoxProfile(profile_directory)# 启动浏览器配置
driver = webdriver.Firefox(profile)

其实很简单,在调用浏览器的前面,多加2行代码而已,主要是要弄清楚原理。


2.2 常用8种元素定位(Firebug和firepath)

前言:元素定位在firefox上可以安装Firebug和firepath辅助工具进行元素定位。

2.2.1 环境准备

1.浏览器选择:Firefox 2.安装插件:Firebug和FirePath(设置》附加组件》搜索:输入插件名称》下载安装后重启浏览器) 3.安装完成后,页面右上角有个小爬虫图标 4.快速查看xpath插件:XPath Checker这个可下载,也可以不用下载 5.插件安装完成后,点开附加组件》扩展,如下图所示

2.2.2 查看页面元素

以百度搜索框为例,先打开百度网页 1.点右上角爬虫按钮 2.点左下角箭头 3.将箭头移动到百度搜索输入框上,输入框高亮状态 4.下方红色区域就是单位到输入框的属性:

<input id="kw" class="s_ipt" type="text" autocomplete="off" maxlength="100" name="wd">

2.2.3 find_element_by_id()

1.从上面定位到的元素属性中,可以看到有个id属性:id="kw",这里可以通过它的id属性定位到这个元素。 2.定位到搜索框后,用send_keys()方法,输入文本。

2.2.4 find_element_by_name()

1.从上面定位到的元素属性中,可以看到有个name属性:name="wd",这里可以通过它的name属性单位到这个元素。 说明:这里运行后会报错,说明这个搜索框的name属性不是唯一的,无法通过name属性直接定位到输入框

2.2.5 find_element_by_class_name()

1.从上面定位到的元素属性中,可以看到有个class属性:class="s_ipt",这里可以通过它的class属性定位到这个元素。

2.2.6 find_element_by_tag_name()

1.从上面定位到的元素属性中,可以看到每个元素都有tag(标签)属性,如搜索框的标签属性,就是最前面的input。 2.很明显,在一个页面中,相同的标签有很多,所以一般不用标签来定位。以下例子,仅供参考和理解,运行肯定报错。

2.2.7 find_element_by_link_text()

1.定位百度页面上"hao123"这个按钮

查看页面元素:

<a class="mnav" target="_blank" href="http://www.hao123.com">hao123</a>

2.从元素属性可以分析出,有个href = "http://www.hao123.com

说明它是个超链接,对于这种元素,可以用以下方法:

2.2.8 find_element_by_partial_link_text()

1.有时候一个超链接它的字符串可能比较长,如果输入全称的话,会显示很长,这时候可以用一模糊匹配方式,截取其中一部分字符串就可以了

2.如“hao123”,只需输入“ao123”也可以定位到

2.2.9 find_element_by_xpath()

1.以上定位方式都是通过元素的某个属性来定位的,如果一个元素它既没有id、name、class属性也不是超链接,这么办呢?或者说它的属性很多重复的。这个时候就可以用xpath解决。 2.xpath是一种路径语言,跟上面的定位原理不太一样,首先第一步要先学会用工具查看一个元素的xpath。

3.按照上图的步骤,在FirePath插件里copy对应的xpath地址。

2.2.10 find_element_by_css_selector()

1.css是另外一种语法,比xpath更为简洁,但是不太好理解。这里先学会如何用工具查看,后续的教程再深入讲解 2.打开FirePath插件选择css 3.定位到后如下图红色区域显示

总结: selenium的webdriver提供了18种(注意是18种,不是8种)的元素定位方法,前面8种是通过元素的属性来直接定位的,后面的xpath和css定位更加灵活,需要重点掌握其中一个。 a.前八种是大家都熟悉的,经常会用到的:

1.id定位:find_element_by_id(self, id_)

2.name定位:find_element_by_name(self, name)

3.class定位:find_element_by_class_name(self, name)

4.tag定位:find_element_by_tag_name(self, name)

5.link定位:find_element_by_link_text(self, link_text)

6.partial_link定位find_element_by_partial_link_text(self, link_text)

7.xpath定位:find_element_by_xpath(self, xpath)

8.css定位:find_element_by_css_selector(self, css_selector)

b.这八种是复数形式(2.8和2.27章节有介绍)

9.id复数定位find_elements_by_id(self, id_)

10.name复数定位find_elements_by_name(self, name)

11.class复数定位find_elements_by_class_name(self, name)

12.tag复数定位find_elements_by_tag_name(self, name)

13.link复数定位find_elements_by_link_text(self, text)

14.partial_link复数定位find_elements_by_partial_link_text(self, link_text)

15.xpath复数定位find_elements_by_xpath(self, xpath)

16.css复数定位find_elements_by_css_selector(self, css_selector

c.这两种是参数化的方法,会在以后搭建框架的时候,会经常用到PO模式,才会用到这个参数化的方法(将会在4.2有具体介绍)

17.find_element(self, by='id', value=None)

18.find_elements(self, by='id', value=None)

2.3 xpath定位

前言:在上一篇简单的介绍了用工具查看目标元素的xpath地址,工具查看比较死板,不够灵活,有时候直接复制粘贴会定位不到。这个时候就需要自己手动的去写xpath了,这一篇详细讲解xpath的一些语法。 什么是xpath呢? 官方介绍:XPath即为XML路径语言,它是一种用来确定XML文档中某部分位置的语言。反正小编看这个介绍是云里雾里的,通俗一点讲就是通过元素的路径来查找到这个元素的。

2.3.1 xpath:属性定位

1.xptah也可以通过元素的id、name、class这些属性定位,如下图:

2.于是可以用以下xpath方法定位

2.3.2 xpath:其它属性

1.如果一个元素id、name、class属性都没有,这时候也可以通过其它属性定位到

2.3.3 xpath:标签

1.有时候同一个属性,同名的比较多,这时候可以通过标签筛选下,定位更准一点 2.如果不想制定标签名称,可以用*号表示任意标签 3.如果想制定具体某个标签,就可以直接写标签名称

2.3.4 xpath:层级

1.如果一个元素,它的属性不是很明显,无法直接定位到,这时候我们可以先找它老爸(父元素)。 2.找到它老爸后,再找下个层级就能定位到了。

3.如上图所示,要定位的是input这个标签,它的老爸的id=s_kw_wrap。 4.要是它老爸的属性也不是很明显,就找它爷爷id=form。 5.于是就可以通过层级关系定位到。

2.3.5 xpath:索引

1.如果一个元素它的兄弟元素跟它的标签一样,这时候无法通过层级定位到。因为都是一个父亲生的,多胞胎兄弟。 2.虽然双胞胎兄弟很难识别,但是出生是有先后的,于是可以通过它在家里的排行老几定位到。 3.如下图三胞胎兄弟。

4.用xpath定位老大、老二和老三(这里索引是从1开始算起的,跟Python的索引不一样)。

2.3.6 xpath:逻辑运算

1.xpath还有一个比较强的功能,是可以多个属性逻辑运算的,可以支持与(and)、或(or)、非(not) 2.一般用的比较多的是and运算,同时满足两个属性

2.3.7 xpath:模糊匹配

1.xpath还有一个非常强大的功能,模糊匹配。 2.掌握了模糊匹配功能,基本上没有定位不到的。 3.比如我要定位百度页面的超链接“hao123”,在上一篇中讲过可以通过by_link,也可以通过by_partial_link,模糊匹配定位到。当然xpath也可以有同样的功能,并且更为强大。

可以把xpath看成是元素定位界的屠龙刀。武林至尊,宝刀xpath,css不出,谁与争锋?下节课将亮出倚天剑css定位。

2.4 CSS定位

前言:大部分人在使用selenium定位元素时,用的是xpath定位,因为xpath基本能解决定位的需求。css定位往往被忽略掉了,其实css定位也有它的价值,css定位更快,语法更简洁。 这一篇css的定位方法,主要是对比上一篇的xpath来的,基本上xpath能完成的,css也可以做到。两篇对比学习,更容易理解。

2.4.1 css:属性定位 1.css可以通过元素的id、class、标签这三个常规属性直接定位到 2.如下是百度输入框的的html代码:

<input id="kw" class="s_ipt" type="text" autocomplete="off" maxlength="100" name="wd"/>

3.css用#号表示id属性,如:#kw 4.css用.表示class属性,如:.s_ipt 5.css直接用标签名称,无任何标示符,如:input

2.4.2 css:其它属性

1.css除了可以通过标签、class、id这三个常规属性定位外,也可以通过其它属性定位 2.以下是定位其它属性的格式

2.4.3 css:标签

1.css页可以通过标签与属性的组合来定位元素

2.4.4 css:层级关系

1.在前面一篇xpath中讲到层级关系定位,这里css也可以达到同样的效果 2.如xpath:

//form[@id='form']/span/input和 //form[@class='fm']/span/input也可以用css实现

2.4.5 css:索引

1.以下图为例,跟上一篇一样:

2.css也可以通过索引option:nth-child(1)来定位子元素,这点与xpath写法用很大差异,其实很好理解,直接翻译过来就是第几个小孩。

2.4.6 css:逻辑运算

1.css同样也可以实现逻辑运算,同时匹配两个属性,这里跟xpath不一样,无需写and关键字

2.4.7 css:模糊匹配

1.css的模糊匹配contains('xxx'),网上虽然用各种资料显示能用,但是小编亲自试验了下,一直报错。 2.在各种百度后找到了答案:you can't do this withCSS selectors, because there is no such thing as:contains() in CSS. It was a proposal that was abandoned years ago. 非常遗憾,这个语法已经被抛弃了,所以这里就不用管这个语法了。 css语法远远不止上面提到的,还有更多更强大定位策略,有兴趣的可以继续深入研究。官方说法,css定位更快,语法更简洁,但是xpath更直观,更好理解一些。

回到顶部

2.5 SeleniumBuilder辅助定位元素

前言 对于用火狐浏览器的小伙伴们,你还在为定位元素而烦恼嘛? 上古神器Selenium Builder来啦,哪里不会点哪里,妈妈再也不用担心我的定位元素问题啦!(但是也不是万能,基本上都能覆盖到)

2.5.1 安装Selenium Builder

在火狐浏览器的附加组件中搜索添加Selenium Builder即可。安装好后如下图所示:

2.5.2 直接运用

1.打开你要测试的URL或者打开插件后输入你要测试的URL,如下图

2.点击后弹出一个弹窗,如下图:

注:如果你是直接在你要测的网页页面打开这个插件时,selenium builder会直接获取你要测的URL

3.点击record:

然后你就可以哪里不会点哪里了。这里举个例子:

2.5.3 实践案例

1.百度首页,点击百度一下,然后点击登录,再一次点击账号和密码输入框,让我们来看看结果。

2.这里没有展开,点击展开后可以发现定位该元素的多种方法

直接选择你想要的方法复制粘贴即可,不用的话直接关掉弹窗即可。

2.6 操作元素(键盘和鼠标事件)

前言 在前面的几篇中重点介绍了一些元素的定位方法,定位到元素后,接下来就是需要操作元素了。本篇总结了web页面常用的一些操作元素方法,可以统称为行为事件 有些web界面的选项菜单需要鼠标悬停在某个元素上才能显示出来(如百度页面的设置按钮)。

2.6.1 简单操作

1.点击(鼠标左键)页面按钮:click() 2.清空输入框:clear() 3.输入字符串:send_keys() 4.send_keys()如果是发送中文的,前面需加u,如:u"中文",因为这里是输入到windows系统了,windows系统是GBK编码,我们的脚本是utf-8,需要转码为Unicode国际编码,这样才能识别到。

2.6.2 submit提交表单

1.在前面百度搜索案例中,输入关键字后,可以直接按回车键搜索,也可以点搜索按钮搜索。 2.submit()一般用于模拟回车键。

2.6.3 键盘操作

1.selenium提供了一整套的模拟键盘操作事件,前面submit()方法如果不行的话,可以试试模拟键盘事件 2.模拟键盘的操作需要先导入键盘模块:from selenium.webdriver.common.keysimport Keys 3.模拟enter键,可以用send_keys(Keys.ENTER)

4.其它常见的键盘操作: 键盘F1到F12:send_keys(Keys.F1)把F1改成对应的快捷键:

复制Ctrl+C:send_keys(Keys.CONTROL,'c')

粘贴Ctrl+V:send_keys(Keys.CONTROL,'v')

全选Ctrl+A:send_keys(Keys.CONTROL,'a')

剪切Ctrl+X:send_keys(Keys.CONTROL,'x')

制表键Tab: send_keys(Keys.TAB)

这里只是列了一些常用的,当然除了键盘事件,也有鼠标事件。

2.6.4 鼠标悬停事件

1.鼠标不仅仅可以点击(click),鼠标还有其它的操作,如:鼠标悬停在某个元素上,鼠标右击,鼠标按住某个按钮拖到 2.鼠标事件需要先导入模块:from selenium.webdriver.common.action_chainsimport ActionChains perform() 执行所有ActionChains中的行为; move_to_element() 鼠标悬停。 3.这里以百度页面设置按钮为例:

4.除了常用的鼠标悬停事件外,还有 右击鼠标:context_click() 双击鼠标:double_click() 依葫芦画瓢,替换上面案例中对应的鼠标事件就可以了 selenium提供了一整套完整的鼠标和键盘行为事件,功能还是蛮强大滴。下一篇介绍多窗口的情况下如何处理。


本文作者:web自动化

本文来源:http://www.cnblogs.com/zidonghua/p/7430083.html#_label1


本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-03-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python测试社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 2.1.1 打开网页
  • 2.1.2 设置休眠
  • 2.1.3 页面刷新
  • 2.1.4 页面切换
  • 2.1.5 设置窗口大小
  • 2.1.6 截屏
  • 2.1.7 退出
  • 2.1.8 加载浏览器配置
  • 2.2 常用8种元素定位(Firebug和firepath)
    • 2.2.1 环境准备
      • 2.2.2 查看页面元素
        • 2.2.3 find_element_by_id()
          • 2.2.4 find_element_by_name()
            • 2.2.5 find_element_by_class_name()
              • 2.2.6 find_element_by_tag_name()
                • 2.2.7 find_element_by_link_text()
                  • 2.2.8 find_element_by_partial_link_text()
                    • 2.2.9 find_element_by_xpath()
                      • 2.2.10 find_element_by_css_selector()
                      • 2.3 xpath定位
                        • 2.3.1 xpath:属性定位
                          • 2.3.2 xpath:其它属性
                            • 2.3.3 xpath:标签
                              • 2.3.4 xpath:层级
                                • 2.3.5 xpath:索引
                                  • 2.3.6 xpath:逻辑运算
                                    • 2.3.7 xpath:模糊匹配
                                    • 2.4 CSS定位
                                      • 2.4.2 css:其它属性
                                        • 2.4.3 css:标签
                                          • 2.4.4 css:层级关系
                                            • 2.4.5 css:索引
                                              • 2.4.6 css:逻辑运算
                                                • 2.4.7 css:模糊匹配
                                                • 2.5 SeleniumBuilder辅助定位元素
                                                  • 2.5.1 安装Selenium Builder
                                                    • 2.5.2 直接运用
                                                      • 2.5.3 实践案例
                                                      • 2.6 操作元素(键盘和鼠标事件)
                                                        • 2.6.1 简单操作
                                                          • 2.6.2 submit提交表单
                                                            • 2.6.3 键盘操作
                                                              • 2.6.4 鼠标悬停事件
                                                              领券
                                                              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档