Selenium 定位方法

百度的首页,在这张页面上有输入框、按钮和文字链接,当然还有图片,页面的底部还有一行文字,左侧还一个下拉框。自动化要做的就是模式鼠标和键盘来操作这些元素,或点击,或输入,或右击,甚至是鼠标拖动等操作。那么我们要想操作这些元素的前提是需要找到它们。那么如何找到他们呢?自动化工具可不像我们一样可以通过肉眼来分辨页面上的元素,并且知道是它们是做什么用的。那么我们来看看这些元素的真实面目。
这里写图片描述

我们知道页面上的元素都是由一行一行的代码组成。它们之间有层级的组织起 来,每个元素有不同的标签名和属性值。那么在 Selenium 当中就是通过这信息来找到不同的元素的。
webdriver 提供了八种元素定位方法:
1.id
2.name
3.classname
4.tagname
5.linktext
6.partiallink text
7.xpath
8.cssselector

在 Python 语言中对应的定位方法如下:
find_element_by_id()
find_element_by_name()
find_element_by_class_name()
find_element_by_tag_name()
find_element_by_link_text()
find_element_by_partial_link_text()
find_element_by_xpath()
find_element_by_css_selector()

百度页面源码截取

……
<input id="kw" class="s_ipt" autocomplete="off" maxlength="100" value="" name="wd">
…… 
<input id="su" class="bg s_btn" type="submit" value="百度一下"> 
……

1.id 定位

name 如果把页面上看元素看作一个人的话,如果我们想找一个人如何去找,那么这个人一定有其别于其它人的“属性”,比如他的身份证号一定和别人不一样,他的名字和别人不一样。那么我们就可以通过身证号和名字来找到一个人。那么 id 就可以看做是一个人的身份号,当然这个 id 并不像我们现实中的身 份证号有那么强的唯一性,如果在一个页面上发现有两个元素的 id=”kw”也是不足为奇的,这个取决前端 代码的规范程度。

对百度首页上的输入框与百度搜索按钮来说,定位方法如下:

find_element_by_id("kw")
find_element_by_id("su") 

find_element_by_id()方法用于元素中 id 属性的定位


2.name 定位

name 的定位与 id 类似,每一个人都会有名字,那么 name 就可作是一个元素的名字。通过 name 定位 输入框:

find_element_by_name("wd")

find_element_by_name()方法用于元素中 name 属性的定位,百度搜索按钮并没有提供 name 属性,那 么我们就不能通过 name 去定位百度搜索按钮。


3.class 定位

class 也是不少元素会有的一个属性,它的定位和 name 以及 id 类似,下面通过 class 去定位百度输入 狂和百度搜索按钮:

find_element_by_class_name("s_ipt")
find_element_by_class_name("bg s_btn")

find_element_by_class_name()方法用于元素中 class 属性的定位。


4.tag 定位

tag 定位取的是一个元素的标签名,通过标签名去定位单个元素的唯一性最底,因为在一个页面中有太多的元素标签为 < div > 和 < input > 了,所以很难通过标签名去区分不同的元素。

通过标签名定位百度首页上的输入框与百度搜索按钮:

find_element_by_tag_name("input")
find_element_by_tag_name("input")

find_element_by_tag_name()方法通过元素的 tagname 来定位元素。通过上面的例子,我们并不能区别不同的元素,因为在一个页面上标签名相同很难以避免。


link 定位与前面介绍的几种定位方法有所不同,它专门用来定位本链接。百度输入框上面的几个文本链接的代码如下:

<a class="mnav" name="tj_trnews" href="http://news.baidu.com">新闻</a> 
<a class="mnav" name="tj_trhao123" href="http://www.hao123.com">hao123</a> 
<a class="mnav" name="tj_trmap" href="http://map.baidu.com">地图</a> 
<a class="mnav" name="tj_trvideo" href="http://v.baidu.com">视频</a> 
<a class="mnav" name="tj_trtieba" href="http://tieba.baidu.com">贴吧>

通过查看上面的代码,我们发现通过 name 属性定位是个不错的选择。不过我们这里为了要学习 link 定位,通过 link 定位实现如下:

find_element_by_link_text("新闻")
find_element_by_link_text("hao123")
find_element_by_link_text("地图")
find_element_by_link_text("视频")
find_element_by_link_text("贴吧")

find_element_by_link_text()方法通过元素标签对之间的文本信息来定位元素。不过,需要强调的是 Python 对于中文的支持并不好,如查 Python 在执行中文的地方出现在乱码,可以在中文件字符串的前面 加个小“u”可以有效的避免乱码的问题,加 u 的作用是把中文字符串转换中 unicode 编码,如: find_element_by_link_text(u”新闻”)


pariallink 定位是对 link 定们的一个种补充,有些文本连接会比较长,这个时候我们可以取文本链接的有一部分定位,只要这一部分信息可以唯一的标识这个链接。

<a class="mnav" name="tj_lang" href="#">一个很长很长的文本链接</a>

通过 partial link 定位如下:

find_element_by_partial_link_text("一个很长的")
find_element_by_partial_link_text("文本连接")

find_element_by_link_text()方法通过元素标签对之间的部分文本信息来定位元素。
前面所介绍的几种定位方法相对来说比较简单,我们理想状态下在一个页面当中每一个元素都会有一 个唯一 id 和 name 属性值,我们通过它的属性值来找到他们,但在实际的项目中并非想象的这般美好。有 时候一个元素并没有 id 或 name 属性,或者会有多个元素的 id 和 name 属性值是一样的,又或者每一次刷 新页面,id 的值都会随机变化。那么在这种情况下我们如何来定位元素呢?

下面介绍 xpath 与 CSS 定位相比上面介绍的方式来说比较难理解,但他们的灵活的定位能力远比上 面的几种方式要强大得多。


XPath 定位

XPath 是一种在 XML 文档中定位元素的语言。因为 HTML 可以看做 XML 的一种实现,所以 selenium 用户可是使用这种强大语言在 web 应用中定位元素。
绝对路径定位:
XPath 有多种定位策略,最简单和直观的就是写元素的绝对路径。如果仍然把一个元素看做一个人的 话,那么现在有一个人,他没有任何属性特征,那么这个人一定会存在于某个地理位置,如:xx 省 xx 市 xx 区 xx 路 xx 号。那么对于一个元素在一个页面当中也会有这样的一个绝对地址。
参考 baidu.html 前端工具所展示的代码,我们可以用下面的方式来找到百度输入框和搜索按钮。

find_element_by_xpath("/html/body/div/div[2]/div/div/div/from/span/input")
find_element_by_xpath("/html/body/div/div[2]/div/div/div/from/span[2]/input")

find_element_by_xpath()方法用于 XPath 语言定位元素。XPath 的绝对路径主要用标签名的层级关系来 定位元素的绝对路径。最外层为 html 语言,body 文本内,一级一级往下查找,如果一个层级下有多个相 同的标签名,那么就按上下顺序确定是第几个,div[2]表示第二个 div 标签。

很多工具都可以让你直接复制Xpath

这里写图片描述


用 By 定位元素

有时需要使用定位方法,在具体通过哪种定位方式(id 或 name)根据实际场景而定位,By 就可以设 置定位策略。

find_element(By.ID,"kw")
find_element(By.NAME,"wd")
find_element(By.CLASS_NAME,"s_ipt")
find_element(By.TAG_NAME,"input")
find_element(By.LINK_TEXT,u"新闻")
find_element(By.PARTIAL_LINK_TEXT,u"新")
find_element(By.XPATH,"//*[@class='bgs_btn']")
find_element(By.CSS_SELECTOR,"span.bgs_btn_wr>input#su")

find_element()方法只用于定位元素。它需要两个参数,第一个参数是定位方式,这个由 By 提供;另 第二个参数是定位的值。在使用 By 时需要将 By 类导入。
fromselenium.webdriver.common.byimportBy

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值