如百度搜索框:
<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()