如百度搜索框:

<input id="kw" name="wd" class="s_ipt" value="" maxlength="255" autocomplete="off">

百度新闻链接:

<a href="http://news.baidu.com" name="tj_trnews" class="mnav">新闻</a>

1.1.1      普通定位

id:find_element_by_id(“kw”)

name: find_element_by_name(“wd”)

class:find_element_by_class_name(“s_ipt”)

tag:find_element_by_tag_name(“input”)(同按钮一样,一般不用)

link:find_element_by_link_text(“新闻”)

partial link:find_element_by_ partial_link_text(“闻”)(取文本链接中的一部分内容)

1.1.2      Xpath定位

1.1.2.1       绝对路径

从/html至input。

1.1.2.2       元素属性

复制xpath://*[@id="kw"]

find_element_by_xpath(” //*[@id="kw"]”)

find_element_by_xpath(” //input[@id="kw"]”)

注:xpath中的属性也可以用name、class、进行定位。

1.1.2.3       父级属性

如果需定位的元素没有属性值,则可通过起上级或更上级属性找到它。

find_element_by_xpath(” //span[@class="bg_s_ipt_wr"]/input”)

1.1.2.4       逻辑运算符

多个元素的多个属性不唯一,无法通过一个属性定位一个元素,则可通过多个属性定位。

find_element_by_xpath(” //input[@id=’kw’ and @class=’su’] /span/input”)

1.1.3      css定位

详见W3CSschool网站。

CSS路径复制方法:chrome:F12,copy——copy selector

 

 

如百度搜索框

<span class="bg s_ipt_wr quickdelete-wrap">

<span class="soutu-btn"></span>

<input id="kw" name="wd" class="s_ipt" value="" maxlength="255" autocomplete="off">

<a href="javascript:;" id="quickdelete" title="清空" class="quickdelete" style="top: 0px; right: 0px; display: none;">

</a>

</span>

1.1.3.1       Class:.

class:find_element_by_css_selector(“.s_ipt"”)

.表示通过class属性定位元素。

1.1.3.2       Id:#

id:find_element_by_css_selector("#kw")

#表示通过id属性定位元素。

1.1.3.3       标签名

标签名:find_element_by_css_selector("input") (重复性高,定位准确性低)

1.1.3.3.1     父子关系定位

find_element_by_css_selector("span>input")

1.1.3.3.2     属性定位

find_element_by_css_selector(“[name=’kw’]”)

find_element_by_css_selector(“[autocomplete=off]”)

find_element_by_css_selector(‘[type=”submit”]’)

1.1.3.3.3     组合定位

find_element_by_css_selector(“form.fm>span>input.s_ipt”)(父子关系&class)

find_element_by_css_selector(“form.fm>span>input#kw”) (父子关系&id)

 

1.1.4      Xpath和CSS定位对比

目标

XPath

CSS 3

所有元素

//*

*

所有的P元素

//p

p

所有的p元素的子元素

//p/*

p > *

根据ID获取元素

//*[@id='foo']

#foo

根据Class获取元素

//*[contains(@class,'foo')] 1

.foo                               

拥有某个属性的元素

//*[@title]

*[title]

所有P元素的第一个子元素

//p/*[0]

p > *:first-child

所有拥有子元素a的P元素

//p[a]

无法实现

下一个兄弟元素

//p/following-sibling::*[0]

p + *



1.1.5      By定位

  • id:find_element(By.ID,“kw”)
  • name: find_element(By.NAME,“wd”)
  • class:find_element(By.CLASS_NAME,“s_ipt”)
  • tag:find_element(By.TAG_NAME,“input”)(同按钮一样,一般不用)
  • link:find_element(By.LINK_TEXT_text,“新闻”)
  • partial link:find_element(By. PARTIAL_LINK_TEXT,“闻”)(取文本链接中的一部分内容)
  • Xpath:find_element(By.XPATH,“//*[@id=’kw’]”)
  • CSS:find_element(By.CSS,” #kw”)

注:试用By之前需要将By引入:

from selenium.webdriver.common.by import By

 

1.1     定位一组元素

如所有复选框、所有checkbox等。

  • id:find_elements_by_id(“kw”)
  • name: find_elements_by_name(“wd”)
  • class:find_elements_by_class_name(“s_ipt”)
  • tag:find_elements_by_tag_name(“input”)(同按钮一样,一般不用)
  • link:find_elements_by_link_text(“新闻”)
  • partial link:find_elements_by_ partial_link_text(“闻”)(取文本链接中的一部分内容)
  • xpath:find_elements_by_xpath(” //input[@id="kw"]”)
  • class:find_elements_by_css_selector(“.s_ipt"”)

例如:

# 定位元素组
# coding=utf-8
from selenium import webdriver
from time import *

driver = webdriver.Chrome()
driver.get("http://news.baidu.com/")
hrefs = driver.find_elements_by_xpath('//*[@id="header-link-wrapper"]/li[*]/a')
for i in hrefs:
    if i.get_attribute('text') == '贴吧':
        i.click()
        sleep(2)
        driver.quit()  
#执行会报: [WinError 10053] 你的主机中的软件中止了一个已建立的连接 暂不知原因

len()计算元素的个数;

pop()获取列表中的一个元素,默认最后一个

pop(0):默认获取一组元素中的第1个

pop(1):默认获取一组元素中的第2个

pop(-1):默认获取一组元素中的第一个,同pop()

posted on 2018-05-05 07:32  jxba  阅读(224)  评论(0编辑  收藏  举报