selenium元素定位

selenium提供一下几种元素定位的方法:

1. 通过id定位
2. 通过class定位
3. 通过name属性定位
4. 通过标签名定位
5. 通过链接文本定位
6. 通过xpath定位
7. 通过css选择器定位

通过id定位

语法:

find_element_by_id(self, id_):
find_elements_by_id(self, id_):

示例

定位id为“world”的元素
world = driver.find_element_by_id("world")
print(world.text)

####通过class定位

语法:

find_element_by_class_name(self, name):
find_elements_by_class_name(self, name):

示例:

定位class名称为“head_title"的元素
head_title = driver.find_element_by_class_name("head_title")
print(head_title.text)

通过name属性定位

语法:

find_element_by_name(self, name):
find_elements_by_name(self, name):

示例:

定位name为“username”的元素
username = driver.find_element_by_name("username")
print(username.get_attribute("value"))

通过标签名定位

语法:

find_element_by_tag_name(self, name):
find_elements_by_tag_name(self, name):

示例:

定位标签为<button>的元素
submit_btn = driver.find_element_by_tag_name("button")
print(submit_btn.text)

通过链接文本定位

语法:

find_element_by_link_text(self, link_text):
find_element_by_partial_link_text(self, link_text):

示例:

定位链接文本完全匹配“我的看云首页”的元素
kancloud = driver.find_element_by_link_text("我的看云首页")
print(kancloud.get_attribute("href"))
# 定位链接文本部分匹配“看云首页”的元素
kancloud = driver.find_element_by_partial_link_text("看云首页")
print(kancloud.get_attribute("href"))

通过xpath定位

语法:

find_element_by_xpath(self, xpath):
find_elements_by_xpath(self, xpath):

示例:

xpath定位,相对路径定位用户名输入框
username = driver.find_element_by_xpath("//body/div/input")
print(username.get_attribute("value"))
# xpath定位,相对路径与属性结合 定位密码输入框
password = driver.find_element_by_xpath("//input[@name='password']")
print(password.get_attribute("value"))
# xpath定位,多个属性结合 定位密码输入框
password = driver.find_element_by_xpath("//input[@name='password'][@type='text']")
print(password.get_attribute("value"))

通过css选择器定位

语法:

find_element_by_css_selector(self, css_selector):
find_elements_by_css_selector(self, css_selector):

示例:

css选择器,标签+属性 定位用户名输入框
username = driver.find_element_by_css_selector("input[name='username']")
print(username.get_attribute("value"))
# css选择器,标签+class类名 定位用户名输入框
username = driver.find_element_by_css_selector("input.user_name")
print(username.get_attribute("value"))
# css选择器,标签+多个class类名,定位密码输入框,注意不要空格,空格代表下一级子元素
password = driver.find_element_by_css_selector("input.ptqa.pwd")
print(password.get_attribute("value"))
# css选择器,id+多个class类名,定位密码输入框
password = driver.find_element_by_css_selector("#login_form .ptqa.pwd")
print(password.get_attribute("value"))
# css选择器,多级class类名,定位密码输入框
password = driver.find_element_by_css_selector(".login .ptqa.pwd")
print(password.get_attribute("value"))
# css选择器,class类名+属性,定位密码输入框
password = driver.find_element_by_css_selector(".login .ptqa[name='password']")
print(password.get_attribute("value"))
#css 选择器,根据父子关系,定位密码输入框
password = driver.find_element_by_css_selector("div[id='login_form']>input[name='password']")
print(password.get_attribute("value"))
# css 选择器,根据兄弟关系,定位密码输入框
password = driver.find_element_by_css_selector("input[name='username']+input")
print(password.get_attribute("value"))
*上面的定位元素方法,都列出了两个,其中一个是 find_elements_by_xxx,这个方法用在获取结果有多个元素的情况,例如下面获取下拉列表选项*
# find_element_by_css_selector 获取的是单个元素
mm = driver.find_element_by_class_name("city").find_element_by_css_selector("option[value='mm']")
print(mm.text)

print("-"*20)
# 用find_elements_by_css_selector获取的是元素组列表
cities = driver.find_elements_by_css_selector(".city option")
print(type(cities))
for city in cities:
	print(city.text)

通用的终极定位语法

上面的所有元素定位 find_element_by_xxx和find_elements_by_xxx调用的结果,实际上都是在调用以下两种方法,我们也可以直接调用一下两种方法即可。
find_element(self, by=By.ID, value=None):
find_elements(self, by=By.ID, value=None):
class By(object):
    # Set of supported locator strategies.

    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"

例如:

from selenium.webdriver.common.by import By

根据id,定位id为“world”的元素

world = driver.find_element(By.ID,"world")
print(world.text)

xpath定位,相对路径与属性结合 定位密码输入框

password = driver.find_element(By.XPATH,"//input[@name='password']")
print(password.get_attribute("value"))

css选择器,标签+属性 定位用户名输入框

username = driver.find_element(By.CSS_SELECTOR,"input[name='username']")
print(username.get_attribute("value"))

我最喜欢的定位方式,优先是id,如果没有id找class,如果class不好定位,找css选择器。我觉得css选择器是最灵活也是最强大的定位方式。使用xpath定位切记不要用绝对路径,最好结合相对路径与属性。**

转载至 https://www.kancloud.cn/guanfuchang/python_selenium