一、根据id定位
以百度网址首页为例,按f12打开开发者工具,查看页面元素信息。
<!-- 百度主页下的搜索输入框html结构 -->
<input type="text" class="s_ipt" name="wd" id="kw" maxlength="100" autocomplete="off">
driver.find_element(By.ID, "kw")
二、根据name定位
driver.find_element(By.NAME, "wd")
三、根据class定位
driver.find_element(By.CLASS_NAME, "s_ipt")
如果class属性的值含有空格,使用class定位会报错
四、根据tag_name定位
tag为标签,tag_name是通过html中的标签名进行定位的。通常页面中的标签不唯一,不能只通过tag_name进行精确定位。
# 找出所有input标签
tag_input = driver.find_elements(By.TAG_NAME, "input")
for i in tag_input:
# 找出input标签中id属性是kw的
if i.get_attribute('id') == 'kw':
# 执行需要的动作
i.send_keys("tag定位")
五、根据link_text定位
<!-- 百度主页下的hao123链接的html结构 -->
<a href="https://www.hao123.com?src=from_pc_logon" target="_blank" class="mnav c-font-normal c-color-t">hao123</a>
link_text和partial_link_text定位的是<a>标签内的文本。
link_text是精确匹配。
driver.find_element(By.LINK_TEXT, "hao123")
六、根据partial_link_text定位
partial_link_text是模糊匹配。
driver.find_element(By.PARTIAL_LINK_TEXT, "hao")
七、根据css_selector定位
css_selector定位又可以细分为id选择器、class选择器、标签选择器和属性选择器。
同样还是百度首页搜索输入框的例子。
1、id选择器
driver.find_element(By.CSS_SELECTOR, "#kw")
2、class选择器
driver.find_element(By.CSS_SELECTOR, ".s_ipt")
如果class属性的值含有空格,每一个空格前都要加“.”
driver.find_element(By.CSS_SELECTOR, ".bg.s_btn")
3、标签选择器
driver.find_element(By.CSS_SELECTOR, "input")
4、属性选择器
driver.find_element(By.CSS_SELECTOR, "[id='kw']")
5、常用css selector
选择器 | 例子 | 例子描述 |
---|---|---|
.class | .s_ipt | 选择class=“s_ipt”的元素 |
#id | #kw | 选择id="kw"的元素 |
* ^ $ | class*="ip" class^="s_" class$="pt" |
选择包含ip/以s_k开头/以pt结尾的class元素 |
element | p | 选择所有<p>元素 |
element,element | div,p | 选择所有<div>和所有<p>元素 |
element element | div p | 选择<div>的子孙元素<p> |
element>element | div>p | 选择<div>的子元素<p> |
element+element | div+p | 选择紧接在<div>之后的兄弟元素<p> |
element~element | div~p | 选择在<div>之后的所有兄弟元素<p> |
[attribute] | [target] | 选择带有target属性的元素 |
[attribute=value] | [target="_blank"] | 选择target属性为_blank的元素 |
:nth-child(n) | p:nth-child(2) p:nth-last-child(2) |
选择是其父元素的(倒数)第二个子元素的<p>元素 |
逻辑定位
各选择器通常可以结合使用,不需要使用逻辑运算符连接。
“标签名[属性1= 属性值][属性2=属性值]”。
# 选择id属性为kw并且name属性为wd同时class属性为s_ipt的input元素
driver.find_element(By.CSS_SELECTOR, "input[id = 'kw'][name = 'wd'].s_ipt")
nth-child(n)和nth-last-child(n)
定位(倒数)第n个子元素。是所有子元素的第n个,而不是这个标签的第n个。如果位置和标签不对应会无法定位。
# 选择父元素class属性为s-top-left-new s-isindex-wrap的第二个子元素a
driver.find_element(By.CSS_SELECTOR, "[class='s-top-left-new s-isindex-wrap']>a:nth-child(2)")
八、根据xpath定位
1、绝对路径
从html根节点层层定位,路径唯一。即便页面代码结构只发生了微小的变化,也可能会使原先有效的xpath定位表达式定位失败。通常不推荐使用。
driver.find_element(By.XPATH, '/html/body/div[1]/div[1]/div[5]/div/div/form/span[1]/input')
2、相对路径
从当前节点进行定位,不考虑在整个html页面中的位置。一般不会受页面结构变化的影响。
driver.find_element(By.XPATH, "//*[@id='kw']")
3、常用xpath
表达式 | 描述 | 例子 |
---|---|---|
/ | 从根节点选取(取子节点)。简单理解为绝对路径。 | /html/body/div[1]/div[1] |
// | 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置(取子孙节点)。简单理解为相对路径。 | //input/div//span |
. | 选取当前节点。 | |
.. | 选取当前节点的父节点。 | //input/.. |
@ | 选取属性。 | //@lang |
* | 通配符,表示任意节点或任意属性 | //* |
属性定位
直接通过属性名定位,“//标签名[@属性='属性值']”。
driver.find_element(By.XPATH, "//input[@name='wd']")
text()
通过标签内的文本定位,“//标签名[text()='文本内容']”。
driver.find_element(By.XPATH, "//a[text()='hao123']")
contains()
模糊定位,通过某属性的值的一部分定位。
“//标签名[contains(@属性, '属性值')]”,“//标签名[contains(text(), '文本内容')]”
# 都是定位到百度主页下的hao123
driver.find_element(By.XPATH, "//a[contains(@href, 'src=from_pc')]")
driver.find_element(By.XPATH, "//a[contains(text(), 'hao')]")
逻辑定位
通过多个属性标签进行定位。使用“and、or、not”逻辑运算符进行连接。
"//标签名[@属性='属性值' and/or @属性='属性值']","//标签名[not(@属性='属性值')]"
# 都是定位到百度主页下的搜索输入框
driver.find_element(By.XPATH, "//input[@id='kw' or @name='wd']")
driver.find_element(By.XPATH, "//input[not(@id='xx') and @name='wd']")
position()
选择需要定位的标签在其父元素的所以子元素中的位置。(倒数)第几个。
"标签名[n]"、"标签名[last()-n]"、"标签名[position()=n]"。last()为最后一个,last()-1为倒数第二个。
position()相比前两种,可以使用“<、>”等符号进行范围定位,前几个或者后几个。
# 都是定位到百度主页下的hao123
driver.find_element(By.XPATH, "//div[@id='s-top-left']/a[2]")
driver.find_element(By.XPATH, "//div[@id='s-top-left']/a[last()-5]")
driver.find_element(By.XPATH, "//div[@id='s-top-left']/a[position()=2]")