一、根据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定位的是标签内的文本。
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元素elementp选择所有
元素element,elementdiv,p选择所有
元素element elementdiv p选择
element>elementdiv>p选择
element+elementdiv+p选择紧接在
elementelementdivp选择在
[attribute][target]选择带有target属性的元素[attribute=value][target="_blank"]选择target属性为_blank的元素:nth-child(n)
p:nth-child(2)
p:nth-last-child(2)
选择是其父元素的(倒数)第二个子元素的
元素
逻辑定位
各选择器通常可以结合使用,不需要使用逻辑运算符连接。
“标签名[属性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]")
版权归原作者 G.O 所有, 如有侵权,请联系我们删除。