Selenium WebDriver 只是 Python 的一个第三方框架, 和 Djangoweb 开发框架属于一个性质。
webdriver 提供了八种元素定位方法,python语言中也有对应的方法,
序号 | webdriver元素定位方法 | python中对应方法 |
1 | id | find_element_by_id() |
2 | name | find_element_by_name() |
3 | class name | find_element_by_class_name() |
4 | tag name | find_element_by_tag_name() |
5 | link text | find_element_by_link_text() |
6 | partial link text | find_element_by_partial_link_text() |
7 | xpath | find_element_by_xpath() |
8 | css selector | find_element_by_css_selector() |
其中,前面两个方法的唯一性很高,
找元素,确保其唯一性,否则报错,可以通过搜索来确定,比如下面:输入kw,可以看有多少个id等于kw的
<html>
<head>
<body>
<script>
<div id="wrapper" style="display: block;">
<div id="debug" style="display:block;position:..">
<script>
<div id="head" class="s_down">
<div class="head_wrapper">
<div class="s_form">
<div class="s_form_wrapper">
<div id="lg">
<a id="result_logo" onmousedown="return .." href="/">
<form id="form" class="fm" action="/s" name="f">
<input type="hidden" value="utf-8" name="ie">
<input type="hidden" value="8" name="f" id="kw">
<input type="hidden" value="1" name="rsv_bp" >
<input type="hidden" value="1" name="rsv_idx">
<input type="hidden" value="" name="ch" class="s_ipt">
<input type="hidden" value="02.." name="tn">
<input type="hidden" value="" name="bar">
<span class="bg s_ipt_wr">
<input id="kw" class="s_ipt" autocomplete="off" maxlength="100" value="" name="wd"> <!--输入框-->
</span>
<span class="bg s_btn_wr">
<input id="su" class="bg s_btn" type="submit" value="百度一下"> <!--百度按钮-->
</span>
输入框
<input id="kw" class="s_ipt" name="wd" value="" maxlength="255" autocomplete="off">
’百度一下‘按钮
<input id="su" class="bg s_btn" value="百度一下" type="submit">
#id
dr.find_element_by_id("kw")
dr.find_element_by_id("su")
#name
dr.find_element_by_name("wd")
#clas name,其实就是class
dr.find_element_by_class_name("s_ipt")
dr.find_element_by_class_name("bg s_btn")
#tag name,标签,用得很少,除非是像第二种定位一组元素
dr.find_element_by_tag_name("input")
dr.find_elements_by_tag_name("input")[7].send_keys("ssss") # 定位一组元素,第8个
<a class="mnav" href="http://news.baidu.com" name="tj_trnews">新闻</a>
<a class="mnav" href="http://www.hao123.com" name="tj_trhao123">hao123</a
<a class="mnav" href="http://map.baidu.com" name="tj_trmap">地图</a>
<a class="mnav" href="http://v.baidu.com" name="tj_trvideo">视频</a>
<a class="mnav" href="http://tieba.baidu.com" name="tj_trtieba">一个很长很长的文本</a>
#link text
dr.find_element_by_link_text("新闻").click()
dr.find_element_by_link_text("一个很长很长的文本").click()
dr.find_element_by_partial_link_text("文本") # 对上面的补充,部分文字链接
#xpath
dr.find_element_by_xpath()
# id 不指定标签
dr.find_element_by_xpath("//*[@id='kw']") # //表示某个目录下,/表示根目录,*表示标签名,可以指定,也可以不指定,此处不指定。整体含义:某个路径下的某个标签下有一个id属性等于kw
# id 指定标签,可以缩小范围
dr.find_element_by_xpath('//input[@id="kw"]')
# name
dr.find_element_by_xpath('//input[@name="wd"]')
# class
dr.find_element_by_xpath('//input[@class="s_ipt"]')
# 具有的其余属性,比如maxlength
dr.find_element_by_xpath('//input[@maxlength="100"]')
所以,所有属性都可以,只要是唯一的。
如果没有可用的属性,则找上级
# 上级(父级)标签span
dr.find_element_by_xpath('//span[@class="bg s_ipt_wr"]/input') # 此处一个/表示父子关系,下一级
dr.find_element_by_xpath('//span[@class="bg s_ipt_wr"]/input[@class="s_ipt"]') # 父级属性加子级属性,更精确
# 上上级(爷爷级)标签form
dr.find_element_by_xpath("//form[@id='form']/span[2]/input") # 第二个span,从1开始的,百度按钮
firebug复制路径
xpath路径
/html/body/div/div[1]/div/div[1]/div/form/span[2]/input # 里面的数字是从1开始的,也可以通过收起来、展开来确定是第几个标签
最简xpath路径
//*[@id="su"]
css路径
html body div#wrapper div#head div.head_wrapper div.s_form div.s_form_wrapper form#form.fm span.bg.s_btn_wr input#su.bg.s_btn
# 绝对路径,一定可以找到某个元素,但是页面发生一点变化,就失效
dr.find_element_by_xpath("/html/body/div[7]/div/form/span[2]/input").click()
# and or
dr.find_element_by_xpath("//input[@id='kw' and @class='s_ipt' and @autocomplete='off']")
# css
dr.find_element_by_css_selector()
# class
dr.find_element_by_css_selector(".s_ipt") # class,点号后面表示是class的值
# id
dr.find_element_by_css_selector("#kw") # id
# name,值未加引号
dr.find_element_by_css_selector("[name=wd]") # name
# name,值加引号
dr.find_element_by_css_selector("[name='wd']") # name
# 其余属性
dr.find_element_by_css_selector("[maxlength='100']")
# 上级
dr.find_element_by_css_selector("span.bg s_ipt_wr > input")
# 上级,子标签标识class
dr.find_element_by_css_selector("span.bg s_ipt_wr > input.s_ipt")
# 上级,子标签标识id
dr.find_element_by_css_selector("span.bg s_ipt_wr > input#kw") # #表示id
# 上上级
dr.find_element_by_css_selector("form#form >span.bg s_ipt_wr > input#kw")