webdriver 提供了八种元素定位方法: id、 name、 class name、 tag name、 link text、 partial link text、 xpath、 css selector
对应到Python中的方法为:
find_element_by_id(“xx”)
find_element_by_name(“xx”)
find_element_by_class_name(“xx”)
find_element_by_tag_name(“xx”)
find_element_by_link_text(“xx”)
find_element_by_partial_link_text(“xx”)
find_element_by_xpath(“xx”)
find_element_by_css_selector("xx")
下面着重讲一下后两种方法的使用:
find_element_by_xpath(“xx”)
1.绝对路径定位:主要用标签名的层级关系来定位元素的绝对路径(如果一个层级下有多个相同的标签名,那么就按上下顺序确定是第几个,div[2]表示第二个 div 标签)
如:find_element_by_xpath("/html/body/div/div[2]/div/div/div/from/span/input")
2.利用元素属性定位
find_element_by_xpath("//input[@id='kw']") //表示当前页面某个目录下,input 表示定位元素的标签名,[@id='kw'] 表示这个元素的 id 属性值等于kw。
如果不想指定标签名也可以用星号(*)代替,
如:find_element_by_xpath("//*[@class='bg s_btn']")
使用 XPath 不仅仅只局限在 id、name 和 class 这三个属性值,元素的任意属性值都可以使用,只要它能唯一的标识一个元素
如 :find_element_by_xpath("//input[@maxlength='100']")
3.层级与属性结合:如果一个元素本身并没有可以唯一标识这个元素的属性值,我们可以找其上一级元素
事例代码如下
.....
<form id="form" class="fm" action="/s" name="f">
<input type="hidden" value="utf-8" name="ie">
<input type="hidden" value="8" name="f">
<input type="hidden" value="1" name="rsv_bp">
<input type="hidden" value="1" name="rsv_idx">
<input type="hidden" value="" name="ch">
<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>
......
如:find_element_by_xpath("//span[@class='bg s_ipt_wr']/input")//span[@class='bg s_ipt_wr'] 通过 class 属性定位到是父元素,后面/input 也就表示父元素下面标签名为input 的子元素
也可以找上上一级,如: find_element_by_xpath("//form[@id='form']/span[2]/input")
4.使用逻辑运算符:如果一个属性不能唯一的区分一个元素,我们还可以使用逻辑运算符连接多个属性来区别于其它属性。
事例代码如下
<input id="kw" class="su" name="ie">
<input id="kw" class="aa" name="ie">
<input id="bb" class="su" name="ie">
要定位到第一行,可以通过逻辑运算符号连接
find_element_by_xpath("//input[@id='kw' and @class='su']/span/input")
find_element_by_css_selector("xx"):CSS(Cascading Style Sheets)是一种语言,它被用来描述 HTML 和 XML 文档的表现。CSS 使用选择器来为页面元素绑定属性
CSS 选择器的常见语法如下:
事例代码如下:
.....
<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>
.....
1.通过class属性定位:
find_element_by_css_selector(".s_ipt") //(.)表示通过class属性定位元素
2.通过ID属性定位:
find_element_by_css_selector("#kw") //(#)表示通过ID属性定位元素
3.通过父子关系定位:
find_element_by_css_selector("span>input") //查找span下的input元素
4.通过属性定位:
find_element_by_css_selector("input[maxlength='100']") //这些属性是唯一的就行
5.组合定位:
find_element_by_css_selector("span.bg s_ipt_wr>input.s_ipt") //父元素标签叫span,他的class属性叫bg s_ipt_wr,找其下的标签input,class属性为s_ipt的元素
再讲一种很方便的定位方法 用By定位元素
需要先导入库 from selenium.webdriver.common.by import By
使用find_element()方法只用于定位元素。它需要两个参数,第一个参数是定位方式,这个由 By 提供;另第二个参数是定位的值
find_element(By.ID,"kw")//定位ID为“kw”的
find_element(By.NAME,"wd")定位name为“wd”的
find_element(By.CLASS_NAME,"s_ipt")定位class_name为“s_ipt”的
find_element(By.TAG_NAME,"input")定位tag_name为“input”的
find_element(By.LINK_TEXT,u"新闻")定位链接文本为“新闻”的 注:加 u 的作用是把中文字符串转换中 unicode 编码
find_element(By.PARTIAL_LINK_TEXT,u"新")定位链接部分内容为“新”的
find_element(By.XPATH,"//*[@class='bg s_btn']")定位当前目录下class属性为bg s_btn的元素
find_element(By.CSS_SELECTOR,"span.bg s_btn_wr>input#su")定位父span标签为bg s_btn_wr的元素,找到其子元素input标签为su的元素