元素定位
在计算机领域中,页面的最基本组成单元为元素。要确定一个元素,我们需要特定的信息来说明这个元素的唯一特征。
Selenium的8种元素定位方式
元素定位概述
Selenium提供了如下8种定位方式。
定位名称 | 在Python的selenium对应的方法 |
---|---|
●根据ID定位 | find_element_by_id() |
●根据name定位 | find_element_by_name() |
●根据XPath定位 | find_element_by_xpath() |
●根据标签名定位 | find_element_by_tag_name() |
●根据类名定位 | find_element_by_class_name() |
●根据CSS选择器定位 | find_element_by_css_selector() |
●根据链接文本定位 | find_element_by_link_text() |
●根据部分链接文本定位 | find_element_by_partial_link_text() |
在定位元素的过程中,我们也会遇到很多困难,比如,前端设计师常常会使用很多方式来隐藏网页中的元素。常见的隐藏方式有以下几种。
●将opacity设置为0。
●将visibility设置为hidden。
●将display设置为none。
●将position设置为absolute,然后将其位置设置到不可见区域。
通常,这些方式是为防止网络爬虫而设置的。假设网站上一个position被设置为absolute并且位于真实用户不可见区域的表单上,那么当你提交了这个表单后,网站就有足够的证据判断你并不是真正的用户,紧接着服务器就会拒绝你的访问请求。
根据ID定位
HTML属性中的ID是很重要的,这些ID就相当于一个人的身份证。具有特定ID值的HTML元素可以被CSS(Cascading Style Sheet,层叠样式表)选择器和JavaScript脚本查找到,并执行某种特定的功能。为了便于区分,在HTML页面中,我们一般不会设置ID相同的HTML元素,否则会有相当严重的后果。
重点在这里,id=“kw”,从这里可以知道,百度页面中搜索框的ID为kw。再来看一下“百度一下”按钮的代码,如下。
通过上面这段代码我们可以看到,id=“su”。接下来,我们根据获得的两个ID编写一个自动化程序,代码如下。
send_key()是一个方法,用于向搜索框发送特定的字符串。使用它时请不要忘记在特定字符串的前后加上双引号
click()同样也是一个方法,用于向某个特定的HTML元素发送确认请求
根据 name定位
元素的ID和name的区别在哪里?为什么有了ID还需要name呢?ID就像是一个人的身份证号码,而name就像是他的名字。ID的值显然是唯一的,而name的值是可以重复的。
根据XPath定位
XPath的写法是多种多样的,即便使用不同的方式书写,用户也可以查找到相同的元素。比如,要定位百度的搜索框,可以用下面7种写法。
●//[@id=‘kw’]。
●//[@name=‘wd’]。
●//input[@class=‘s_ipt’]。
●/html/body/form/span/input。
●//span[@class=‘soutu-btn’]/input。
●//form[@id=‘form’]/span/input。
●//input[@id=‘kw’ and @name=‘wd’]。
我们可以使用r’****’(***为任意字符,r表示raw string,原始字符串常量)来转义,同时使用单引号以便与XPath的双引号区分开,避免混淆。
根据标签名定位
这种定位方法堪称最不靠谱的定位方法,因为在一个HTML页面中可能会有很多相同的标签。比如,我们常见的百度页面其实并不是只有一个搜索框(它还有很多隐藏的搜索框,这些搜索框各有各的作用,虽然它们采用了input标签,但是它们并不是用来搜索的),只是其他搜索框的属性被设置为隐藏,在自动化测试实践中,我们用到这种方式的机会并不多,很多时候,我们都会采用其他几种方式。
## 根据类名定位
作为HTML标签的属性,class规定元素的类名,绝大多数的class标签都指向CSS中的类。我们可以同时给一个HTML标签附上多个类,比如,通过
根据CSS选择器定位
在CSS中,选择器是一种模式,用于指定特定元素样式的模式。类似于根据XPath定位,根据CSS选择器也有很多种定位元素的方式。以下均为根据CSS选择器定位百度搜索框的方式。
●"#kw"。
●"html > body > form > span > input"。
●"form#form > span > input"。
●"span.soutu-btn> input#kw"。
●".s_ipt"。
●"[name=wd]"。
●[name=wd],选择所有name属性为wd的元素(虽然这个页面只有一个)。●#kw,选择ID为kw的元素(ID是唯一的,只能选择一个)。●a[src^=“http”],选择所有以http作为src开头的元素。
●"html > body > form > span > input",从标签html中选出标签body,依次类推,直到选出input标签。
●".s_ipt",表示选择所有class属性为s_ipt的标签,注意不要忽略了标签前面的点,前面的点才是关键的。
●"span.soutu-btn> input#kw"的这种写法是复合写法,首先查找到class属性中含有soutu-btn的span标签,然后从span标签的子元素中查找ID为kw的input标签。
根据链接文本定位
根据ID和类名定位这两种方法最方便,而下面介绍的这种定位方法最实用。我们换一个目标,不再是搜索框和“百度一下”按钮,而是转到右上角的链接。