Webdriver API
Webdriver 定位元素的8种方法
- id定位:find_element_by_id()
- name定位:find_element_by_name()
- tag定位:find_element_by_tag_name()
- class定位:find_element_by_class_name()
- link_text定位:find_element_by_link_text()
- partial_link定位:find_element_by_partial_link_text()
- XPath定位:find_element_by_xpath()
- CSS_selector定位:find_element_by_css_selector()
eg.百度首页
id定位搜索框
HTML中,id是唯一的
find_element_by_id("kw")
name定位
find_element_by_name("wd")
class定位
find_element_by_class_name("s_ipt")
tag定位
HTML通过tag来定义不同页面的元素
注意:一个标签往往用来定义一类功能,通过标签识别单个元素的概率很低。
find_element_by_tag_name("input")
link定位
link定位用来定位文本链接
eg.百度输入框上面的几个文字链接代码如下
<a href="http://news.baidu.com" target="_blank" class="mnav c-font-normal c-color-t">新闻</a>
<a href="https://www.hao123.com" target="_blank" class="mnav c-font-normal c-color-t">hao123</a>
<a href="http://map.baidu.com" target="_blank" class="mnav c-font-normal c-color-t">地图</a>
<a href="https://haokan.baidu.com/?sfrom=baidu-top" target="_blank" class="mnav c-font-normal c-color-t">视频</a>
<a href="http://tieba.baidu.com" target="_blank" class="mnav c-font-normal c-color-t">贴吧</a>
<a href="http://xueshu.baidu.com" target="_blank" class="mnav c-font-normal c-color-t">学术</a>
通过link定位
find_element_by_link_text("新闻")
find_element_by_link_text("hao123")
find_element_by_link_text("地图")
find_element_by_link_text("视频")
find_element_by_link_text("贴吧")
find_element_by_link_text("学术")
partial link定位
有些文字链接比较长,可以取文字链接的部分文字进行定位
find_element_by_partial_link_text("hao")
对于网页的节点来说,它可以定义 id 、 class 或其他属性。 而且节点之间还有层次关系,在网页中可以通过 XPath 或 css 选择器来定位一个或多个节点 。 那么,在页面解析时,利用 XPath 或 css选择器来提取某个节点,然后再调用相应方法获取它的正文内容或者属性,就可以提取我们想要的任意信息了。
XPath定位
XPath , 全称 XML Path Language ,即 XML 路径语言,它是一门在 XML 文档中查找信息的语言 。它最初是用来搜寻 XML 文档的,但是它同样适用于 HTML 文档的搜索。
XPath使用可以访问官网:https://www.w3.org/TR/xpath
表达式 | 描述 |
---|---|
nodename | 选取此节点的所有子节点 |
/ | 从当前节点选取直接子节点 |
// | 从当前节点选取子孙节点 |
. | 选取当前节点 |
… | 选取当前节点的父节点 |
@ | 选取属性 |
通过绝对路径定位
find_element_by_xpath("/html/body/div/div[2]/div/div/form/span/input")
相对路径定位
find_element_by_xpath("//input[@id='kw']")
如果不想指定标签名,可以使用星号(*)代替,而且使用XPath】不局限于id、name和class三个属性值
find_element_by_xpath('//*[@name="wd"]')
find_element_by_xpath('//input[@maxlength="100"]')
使用逻辑运算符
find_element_by_xpath('//input[@id="kw" and @name="wd"]')
使用contains方法
contains方法用于匹配一个属性中包含的字符串
find_element_by_xpath('//span[contains(@class, "s_ipt")]/input')
使用text()方法
text()用于匹配显示文本信息
find_element_by_xpath("//a[text(), '新闻']")
find_element_by_xpath("//a[contains(text(), '新闻')]")
CSS 定位
CSS选择器常见语法
selector | example | description |
---|---|---|
.class | .intro | class选择器,选择class="intro"的所有元素 |
#id | #firtname | id选择器,选择id="firstname"的所有元素 |
* | * | 选择所有元素 |
element | p | 选择所有 标签元素 |
element > element | div > input | 选择父元素为
的所有input元素
|
element + element | div + input | 选择同一级中紧接着div元素之后的所有input元素 |
[arrtribute=value] | [target=_blank] | 选择target="_blank"的所有元素 |
例如
<span class="bg s_ipt_wr">
<input id="kw" class="s_ipt" autocomplete="off" maxlength="100" name="wd"/>
</span>
<span class="bg s_btn_wr">
<input id="su" class="s_btn" type="submit" value="百度一下"/>
</span>
通过class定位
find_element_by_css_selector(".bg.s_ipt")
find_element_by_css_selector(".s_ipt")
id定位
find_element_by_css_selector("#su")
标签名定位
find_element_by_css_selector("input")
属性定位
find_element_by_css_selector("[autocomplete='off']")
find_element_by_css_selector("[name='kw']")
组合定位
find_element_by_css_selector('form#form > span > input#kw')
更多定位用法
- 查找属性包含“s_ipt_wr”字符串的元素
find_element_by_css_selector("[class*=s_ipt_wr]")
- 查找class属性以“bg”字符串开头的元素
find_element_by_css_selector("[class^=bg]")
- 查找class属性以“wrap”字符串结尾的元素
find_element_by_css_selector('[class$=wrap]')
- 查找input标签下面的第二个input标签的元素
find_element_by_css_selector("form > input:nth-child(2)")
ps:css选择更多用法:http://www.w3school.com.cn/cssref/css_selectors.asp
用By定位元素
用By定位,需要先导入from selenium.webdriver.common.by import By
,使用find_element()
方法需要两个参数,第一个参数是定位的类型,第二个是定位的值。
from selenium.webdriver.common.by import By
# id
find_element(By.ID, "kw")
# class
find_element(By.CLASS_NAME, "s_ipt")
# name
find_element(By.NAME, "wd")
# tag
find_element(By.TAG_NAME, "input")
# link
find_element(By.LINK_TEXT, "新闻")
# partial link
find_element(By.PARTIAL_LINK_TEXT, "hao")
# xpath
find_element(By.XPATH, "//span[@id='kw']")
#csss
find_element(By.CSS_SELECTOR, "span.bg s_btn_wr>input#su")
定位一组元素
- id定位:find_elements_by_id()
- name定位:find_elements_by_name()
- tag定位:find_elements_by_tag_name()
- class定位:find_elements_by_class_name()
- link_text定位:find_elements_by_link_text()
- partial_link定位:find_elements_by_partial_link_text()
- XPath定位:find_elements_by_xpath()
- CSS_selector定位:find_elements_by_css_selector()
import time
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
driver.find_element_by_id("kw").send_keys("python")
driver.find_element_by_id("su").click()
time.sleep(2)
# 定位一组元素
texts = driver.find_elements_by_xpath('//div[@id="content_left"]/div[@cmatchid]')
print(len(texts)) # 5