了解了開發者工具和 HTML 結構 后,接下來,就來看看在 Python + Selenium 中如何查找元素了。
查找元素,是 WebDriver 中的核心部分之一。WebDriver提供了八種定位方法,方法如下:
| 定位方式 | 方法 | 說明 |
|---|---|---|
| id | find_element_by_id() | 使用 id 屬性定位 |
| name | find_element_by_name() | 使用 name 屬性定位 |
| class_name | find_element_by_class_name() | 使用 class 屬性定位 |
| tag_name | find_element_by_tag_name() | 使用標簽名定位 |
| link_text | find_element_by_link_text() | 使用鏈接文本定位,只針對 a 標簽 |
| partial_link_text | find_element_by_partial_link_text() | 使用部分鏈接文本定位 |
| css_selector | find_element_by_css_selector() | 使用 css 選擇器語法定位 |
| xpath | find_element_by_xpath() | 使用 xpath 語法定位 |
id、name、class name、tag name 使用的是元素的本身的一些特殊屬性和標簽名;而link_text、partial_link_text使用的是文本定位,並且僅針對於鏈接地址。這六種定位方式,都是相對簡便的定位方式。
但是由於頁面操作的多樣性,很多時候想操作的元素並非都能找到這么合適的定位方式。所以,需要能夠在更加復雜的環境下的定位方式,在 WebDriver 中提供了兩種更加高級(復雜)的定位方式css selector、xpath。
通過 css selector、xpath 可以使用更加復雜的定位方式,包括使用頁面元素層級定位和使用其他任意的屬性值等方式來定位。通過這兩種方式,可以定位到頁面上的任意位置。
id
HTML 規定id 屬性在 HTML 文檔中必須唯一,id 屬性可用於在 JavaScript
或CSS中針對給定 id 來改變 HTML 元素。id是一個類似身份證的概念,唯一性很強。
但是很多時候,id 並不是特別靠譜的存在:
- HTML 對 id 的唯一性要求沒有從語法上限制,這就導致 id 不唯一也不會出問題,導致開發人員會忽略這種唯一性的要求,導致了 id 並不唯一;
- 對於單選框
radio button和復選框check box,一般由 id 相同的一組input的元素組成; - 由於前段框架的進化迭代,id 有了很多新的含義,比如根據規則或者隨機生成一些數字,導致每次打開同一個頁面時 id 都會變化。
以上三種情況,在使用 id 的時候需要注意辨別。
以百度為例:

找到 百度一下 前面的輸入框的元素,其屬性 id="kw",這就是我們使用 id 定位需要的啦。
為了能看到效果,我們先加上一些簡單的操作方法
send_keys()、click(),對於這些操作方法,后面會詳細講解
為了操作方便,建議大家在學習過程中,使用 IDLE 練習:

這樣可以邊輸入邊查看,並且錯了也可以重新輸入,也可以在瀏覽器中直接操作,略過一些步驟。
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://baidu.com")
driver.find_element_by_id("kw").send_keys("小滿測試")
