要定位一个页面中的元素有多中策略和方法。你可以根据实际情况选择其中最为合适的。Selenium为定位页面元素提供了下面的这些方法:

  • find_element_by_id(使用id)
  • find_element_by_name(使用name属性值)
  • find_element_by_xpath(使用XPath)
  • find_element_by_link_text(使用显示文本)
  • find_element_by_partial_link_text(使用超链接文本)
  • find_element_by_tag_name(使用标签名)
  • find_element_by_class_name(使用类名)
  • find_element_by_css_selector(使用CSS选择器)

要定位多个元素,除了通过id进行定位,只需将elements+s(这些元素将会一个列表的形式返回)

  • find_elements_by_name(使用name属性值)
  • find_elements_by_xpath(使用XPath)
  • find_elements_by_link_text(使用显示文本)
  • find_elements_by_partial_link_text(使用超链接文本)
  • find_elements_by_tag_name(使用标签名)
  • find_elements_by_class_name(使用类名)
  • find_elements_by_css_selector(使用CSS选择器)

除了上面的通用方法外,在一个页面对象进行访问操作的时候还有两个非常有用的私有方法:find_elementfind_elements

使用样例:

from selenium.webdriver.common.by import By

driver.find_element(By.XPATH, '//button[text()="Some text"]')
driver.find_elements(By.XPATH, '//button')

By类可用的属性如下:

ID = "id"
XPATH = "xpath"
LINK_TEXT = "link text"
PARTIAL_LINK_TEXT = "partial link text"
NAME = "name"
TAG_NAME = "tag name"
CLASS_NAME = "class name"
CSS_SELECTOR = "css selector"

4.1.通过id进行定位

当知道一个元素的id属性时可以使用这种方法。使用该方法,将会返回第一个匹配给定id属性值得元素。如果没有元素匹配,将会抛出一个NoSuchElementException异常。

比如,考虑一下下面的页面源码:

<html>
<body>
<form id="loginForm">
<input name="username" type="text" />
<input name="password" type="password" />
<input name="continue" type="submit" value="Login" />
</form>
</body>
<html>

form元素可以通过下面的方法进行定位:

login_form = driver.find_element_by_id("loginForm")

4.2.通过name属性进行定位

当知道一个元素的name属性时可以使用此方法。使用此方法,将会返回匹配给定name属性值的第一个元素。如果没有相匹配的元素,将会抛出一个NoSuchElementException异常。

比如,考虑一下下面的网页源码:

<html>
<body>
<form id="loginForm">
<input name="username" type="text" />
<input name="password" type="password" />
<input name="continue" type="submit" value="Login" />
<input name="continue" type="button" value="Clear" />
</form>
</body>
<html>

usernamepassword元素可以向下面这样定位:

username = driver.find_element_by_name('username')
password = driver.find_element_by_name('password')

下面将会返回Login按钮,因为他出现在Clear按钮的前面:

continue = driver.find_element_by_name('continue')

4.3.使用XPath进行定位

XPath是一种用于定位XML文档节点的语法。因为HTML可以是一种XML实现(XHTML),Selenium用户可以使用这种强大的语言工具来定位他们页面应用的元素。XPath扩展了仅仅通过id和name属性进行元素定位的简单方法(XPath也支持),为元素定位开辟了更多的可能。比如定位页面中的第三个单选框。

当你想要定位的元素没有合适的id和name的时候,使用XPath会是一个比较好的选择。你可以使用XPath通过绝对路径或者相对路径定位没有id和name属性的元素(不推荐使用绝对路径)。除了id和name,XPath定位器也可以通过其他属性指定元素。

XPath包含一个HTML中从根节点开始所有元素的定位,所以当你单独定位一个元素失败的时候,可以稍稍做些调整,通过定位一个紧邻的带有id或name属性的元素,基于相对关系进而定位到你想要的目标元素(最好是一个父节点元素)。只需做很小的改变,你的测试脚本的鲁棒性/稳健性就会大大增强。

举个例子,考虑一下下面的页面源码:

<html>
<body>
<form id="loginForm">
<input name="username" type="text" />
<input name="password" type="password" />
<input name="continue" type="submit" value="Login" />
<input name="continue" type="button" value="Clear" />
</form>
</body>
<html>

form元素可以像下面这样进行定位:

login_form = driver.find_element_by_xpath("/html/body/form[1]")
login_form = driver.find_element_by_xpath("//form[1]")
login_form = driver.find_element_by_xpath("//form[@id='loginForm']")
  1. 绝对路径(HTML只要稍微变动就会失效)
  2. HTML中的第一个form元素
  3. id属性值为loginForm的form元素

username元素可以像下面这样定位:

username = driver.find_element_by_xpath("//form[input/@name='username']")
username = driver.find_element_by_xpath("//form[@id='loginForm']/input[1]")
username = driver.find_element_by_xpath("//input[@name='username']")
  1. 有一个input子元素,name属性为username的form元素
  2. id属性为loginForm的form元素的第一个input子元素
  3. name属性为username的第一个input元素

Clear按钮元素可以像下面这样定位:

clear_button = driver.find_element_by_xpath("//input[@name='continue'][@type='button']")
clear_button = driver.find_element_by_xpath("//form[@id='loginForm']/input[4]")
  1. name属性为continue,type属性为button的input元素
  2. id属性为loginForm的form元素的第四个input子元素

这些示例只包含一些基础使用,想要了解更详细的相关信息,推荐浏览:

也有一些优秀的浏览器插件可以用来辅助编写定位元素的XPath:

4.4.通过链接文本定位超链接

当知道一个锚点标签内使用的链接文本时可以使用本方法。此方法将会返回匹配链接文本的第一个元素。如果没有相匹配的元素,将抛出一个NoSuchElementException异常。

举个例子,考虑一下下面的网页源码:

<html>
<body>
<p>Are you sure you want to do this?</p>
<a href="continue.html">Continue</a>
<a href="cancel.html">Cancel</a>
</body>
<html>

continue.html链接可以像下面这样进行定位:

continue_link = driver.find_element_by_link_text('Continue')
continue_link = driver.find_element_by_partial_link_text('Conti')

4.5.通过标签名定位元素

当想要通过标签名定位元素时可以使用此方法。使用此方法,将会返回匹配给定标签名的第一个元素。如果没有相匹配的元素,将会抛出一个NoSuchElementException异常。

举个例子,考虑一下下面的网页源码:

<html>
<body>
<h1>Welcome</h1>
<p>Site content goes here.</p>
</body>
<html>

标题元素(h1)可以像下面这样定位:

heading1 = driver.find_element_by_tag_name('h1')

4.6.通过类名定位元素

当想要通过类名(class)属性定位元素时可以使用此方法。使用此方法,将会返回匹配给类名属性的第一个元素。如果没有相匹配的元素,将会抛出一个NoSuchElementException异常。

举个例子,考虑下面的网页源码:

<html>
<body>
<p class="content">Site content goes here.</p>
</body>
<html>

p元素可以像下面这样进行定位:

content = driver.find_element_by_class_name('content')

4.7.使用CSS选择器定位元素

当想要使用CSS选择器语法定位元素时可以使用此方法。使用此方法,将会返回匹配给定CSS 选择器的第一个元素。如果没有相匹配的元素,将会抛出一个NoSuchElementException异常。

举个例子,考虑一下下面的网页源码:

<html>
<body>
<p class="content">Site content goes here.</p>
</body>
<html>

p元素可以像像下面这样进行定位:

content = driver.find_element_by_css_selector('p.content')

Sauce Labs 上有关于 CSS 选择器的优秀文档.

[译]Selenium Python文档:四、元素定位的更多相关文章

  1. [译]Selenium Python文档:目录

    作者:Baiju Muthukadan 协议:本文档采用知识共享署名 - 共享4.0国际许可. 原英文网址:http://selenium-python.readthedocs.io/index.ht ...

  2. [译]Selenium Python文档:八、附录:FAQ常见问题

    另外一个FAQ:https://github.com/SeleniumHQ/selenium/wiki/Frequently-Asked-Questions 8.1.怎样使用ChromeDriver ...

  3. [译]Selenium Python文档:一、安装

    1.1.简介 Selenium Python为使用Selenium WebDriver来编写功能/验证测试提供了一个简单的API接口.通过Selenium Python API,你可以以一种非常直观的 ...

  4. [译]Selenium Python文档:二、初步开始

    2.1.简单使用 如果已经安装好了Selenium Python,你就可以像下面这样编写Python代码来使用它了: from selenium import webdriver from selen ...

  5. [译]Selenium Python文档:五、Waits等待

    大多数现代web应用都使用了AJAX技术.当浏览器加载一个页面的时候,该页面内的元素可能在不用的时间间隔内进行加载.这使得元素定位变得比较困难:如果一个元素还没有出现在DOM中,定位函数将会抛出一个E ...

  6. [译]Selenium Python文档:七、WebDriver API接口

    由于API文档格式不太适合cnblog博客,暂且翻译一部分,且暂未校对 注意:这不是官方文档,官方 API文档在这里. 本章包含Selenium WebDriver的所有接口 推荐import风格 本 ...

  7. [译]Selenium Python文档:三、导航控制

    你使用WebDriver要做的第一件事就是访问一个链接.一般通过调用get方法来实现: driver.get("http://www.baidu.com") 在将控制权返给你的脚本 ...

  8. [译]Selenium Python文档:六、页面对象

    本章是介绍页面对象设计模式的教程.一个页面对象代表了web应用用户接口的一片区域,你的测试代码将与之交互的. 使用页面对象模式的好处: 可以创建在多个测试样例中都可使用的可重用代码 减少重复性代码 如 ...

  9. 【转】【selenium+Python WebDriver】之元素定位不到解决办法

    感谢: 煜妃的<Python+Selenium定位不到元素常见原因及解决办法(报:NoSuchElementException)> ClassName定位报错问题:<[Python] ...

随机推荐

  1. js 全选/取消

    平时常用一个小功能 var check_all = document.getElementsByName('student_box'); var check_flag = true; function ...

  2. 蓝桥网试题 java 基础练习 特殊的数字

    -------------------------------------------------------- 笑脸 :-) ------------------------------------ ...

  3. RESTful_简介

    一.概括总结一下什么是RESTful架构: (1)每一个URI代表一种资源: (2)客户端和服务器之间,传递这种资源的某种表现层(Representation): (3)客户端通过四个HTTP动词,对 ...

  4. Surface Dial 与 Windows Wheel UWP应用开发

    随着微软发布 Surface Studio 在演示视频中非常抢眼的一个配件就是 Surface Dial,Dial 是Windows输入设备大家庭中的新成员我们把它归类为Windows Wheel 类 ...

  5. 使用LVS实现负载均衡原理及安装配置详解

    负载均衡集群是 load balance 集群的简写,翻译成中文就是负载均衡集群.常用的负载均衡开源软件有nginx.lvs.haproxy,商业的硬件负载均衡设备F5.Netscale.这里主要是学 ...

  6. PHP静态成员变量

    静态成员:静态类中的成员加入static修饰符,即是静态成员.可以直接使用类名+静态成员名访问此静态成员,因为静态成员存在于内存,非静态成员需要实例化才会分配内存,所以静态成员不能访问非静态的成员.. ...

  7. python - bilibili(一)获取直播间标题

    近几年,直播平台蛮火的.小时候,经过各种日漫的洗礼,在直播平台自然而然的就盯上了B站. 目前还是python菜鸟一枚,各位大佬请轻拍. 最终效果图: 闲话不说,我们来一步步解析B站的弹幕. 工具:py ...

  8. JUnit4 与 JMock 之双剑合璧

    引言 单元测试可以保证代码的质量,最大程度降低修复系统 bug 的时间和成本.能被称为测试的阶段有:单元测试.集成测试.系统测试和用户测试.修复系统 bug 的时间和成本随着这些阶段的推移呈指数级增长 ...

  9. linux下安装Mysql 以及导入数据库

    1.下载mysql的rpm包,创建一个文件夹例如software来放置下面文件 可以通过wget下载具体的地址 (1)MySQL-server-5.6.10-1.rhel5.x86_64.rpm:My ...

  10. Unity渲染优化中文翻译(二)——CPU的优化策略

    紧接上一篇文章,继续渲染的优化问题,若有错误,请指出,让我也学习进步,谢谢. 如果游戏渲染问题来自CPU 概括的来说,CPU在一帧的渲染中的工作可以分为三个部分: . 决定谁需要被渲染 . 为GPU准 ...