四、八大元素定位

一、八大元素定位

  1. id
  2. name
  3. class_name
  4. tag_name
  5. link_text
  6. partial_link_text
  7. xpath
  8. css_selector

1)id元素定位

from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")

# 得到的返回值是一个WebElement的Python对象==》元素
input_elem = driver.find_element_by_id("kw")
print(input_elem)

# 获取属性==》WebElement()
print(input_elem.get_attribute("name"))
# 在Python中不能直接修改元素,selenium没有封装对应的方法

2)find_element 和 find_elements 

一个查找一个,一个是查找多个

前面得到的是一个WebElement对象,后面得到的是一个列表

没有该定位时,前者报错NoSuchElementException,后者返回空列表

# 判断元素是否存在
if not driver.find_elements_by_id("kwkw"):
    print("该元素不存在")
else:
    print("该元素存在")

3)name属性定位

# name属性
driver.find_element_by_name("wd")
driver.find_elements_by_name("wd")

4)class_name属性

driver.find_element_by_class_name("s_ipt")
driver.find_elements_by_class_name("s_ipt")

5)link_text 通过超链接的全部文本

e=driver.find_element_by_link_text("新闻")
e.click()

6)partial_link_text 通过超链接的部分文本

e=driver.find_element_by_partial_link_text("")
e.click()

注意:若果有多个新开头的超链接,永远定位到的都是第一个

7)tag_name属性 (定位元素太多,测试时不用,爬虫的时候用)

driver.find_element_by_tag_name("input")

用的最多的是id name class_name

  • id:唯一的

  • name:用户输入经常会带name属性(源代码按ctrl+f,查找元素)

  • class_name:因为也经常出现

二、元素定位之入坑指南

1)虽然id是唯一的,但是有些网页id是变化的

2)不要用可能会动态变化的属性进行元素定位

    --不规则的字符串,一般会比较长

    --纯数字 ,22,53,23

    --带数字的,a2,kw1,kw3

3)class_name值中间不能有空格(如class=" bg s_ipt_wr quickdelete-wrap")

4)如何确定我的元素表达式只能找到一个元素

    --复制表达式到浏览器,ctrl+f

    --find_elements只有一个元素 

以上六种定位元素(通过单属性定位,只能定位特征明显的元素)

find_element_by_id / by_name / by_tag_name / by class_name等都是在find_element()方法的基础上,进行二次封装的。其本质都是使用的find_element()方法,进行元素定位的。(可查看find_element源码)

driver.find_element("id","kw")    ==  driver.find_element_by_id("kw")

 三、xpath--组合多个特征,组合多个属性--

 Xpath:即XML路径语言(XML Path language),用来确定XML文档中某部分位置的语言

1)获取xpath的表达式

  • 自己编写,第一顺位

  • 使用插件,第二顺位

  • 通过浏览器右击复制,第三顺位

2)绝对定位 相对定位

/:绝对路径(从最开始的地方一层一层进入对应的元素,冗余,容错性差)

//:相对路径(已经在某个位置了,更加简洁,容错性更强)

在自动化测试当中,我们使用相对路径,不用绝对路径

3)xpath表达式

//*[@id="kw"]

  • *代表通配符,这里表示标签名称

  • [@id="kw"]谓语条件,@属性=多少

组合多个条件://*[@id="kw" and @name="wd" and @class="s_ipt"]

通过xpath定位新闻

e= driver.find_element("xpath","//a[text()='新闻']")    # text不是属性,前面不加@

通过xpath contains 定位新闻

e =driver.find_element("xpath","//a[contains(text(),'新闻')]")
e.click()
# 通过祖先和父亲查找
'''//span[@id = 's_kw_wrap']/input[@clas='s_ipt'] '''

# 通过子元素找父元素,使用/..,不能跨级查找
'''' //input[@clas='s_ipt']/../..'''

# 特殊手段1(通过索引,索引是从1开始的)
'''
//input[1]
(//input)[1] 加了括号提高了优先级
'''

4)轴定位

 

哥哥、姐姐==preceding-sibling

弟弟、妹妹==following-sibling

祖先==ancestor (找到比他辈分大的直系,爷爷的同级不会显示) 

如:

通过input找同级span(同级哥哥)

//input[@id="kw"]//preceding-sibling::span

通过input找同级a标签(同级弟弟)

//input[@id="kw"]//following-sibling::a

input输入框的祖先

//input[@id="kw"]//ancestor::span

四、css选择器

.s_ipt       class_name = s_ipt

#kw         id = kw

(.表示class   #表示id)

 css选择器:input[id=kw]  ===>xpath表达式: //input[@id="kw"]

 css查找的单向性---只能通过父元素找子元素

五、xpath和css

--css的好处1:表达式方式更加简洁

--css的好处2:主流浏览器,查询速度快

--xpath的好处1:功能更强:支持更多的函数,查找父元素、轴运算

--xpath的好处2:支持text文本定位,css不支持

--xpath的好处3:对于一些复杂元素,xpath写法反而要简洁

原文地址:https://www.cnblogs.com/zhangjx2457/p/13793087.html