本文內容參考:https://selenium-python.readthedocs.io/locating-elements.html
定位元素有很多種方式,你可以選擇適合你使用情況的。Selenium 提供如下幾種定位元素的方式:
- find_element_by_id
- find_element_by_name
- find_element_by_xpath
- find_element_by_link_text
- find_element_by_partial_link_text
- find_element_by_tag_name
- find_element_by_class_name
- find_element_by_css_selector
上述定位方式只定位頁面中的擁有同樣類型第一個元素,如果想定位同樣名字或同樣名字的所有元素,以下方式可以采用:(返回的是一個列表,這樣的話也意味着你可以定位列表中的任何一個元素,比如可用於有同樣的class name 的元素的的定位,通過 class name定位所有同樣class name的元素列表,再指定列表中的某個元素就 能得到你想要的元素了)
- find_elements_by_name
- find_elements_by_xpath
- find_elements_by_link_text
- find_elements_by_partial_link_text
- find_elements_by_tag_name
- find_elements_by_class_name
- find_elements_by_css_selector
除了上面的方式外,還有兩種可選擇的方式:find_element and find_elements. 但是這兩種方式要導入 By ,如下例子:
from selenium.webdriver.common.by import By driver.find_element(By.XPATH, '//button[text()="Some text"]') driver.find_elements(By.XPATH, '//button')
通過By 的方式,下面的屬性是可以通過By方式調用來定位元素的:
ID = "id" XPATH = "xpath" LINK_TEXT = "link text" PARTIAL_LINK_TEXT = "partial link text" NAME = "name" TAG_NAME = "tag name" CLASS_NAME = "class name" CSS_SELECTOR = "css selector"
此處為分割線
--------------------------------------------------------------------------------------------------------
下面將分別舉例說明每種定位方式:
一、通過 Id 定位元素
這種方式是最好理解的。如果你已經知道某個元素的Id屬性,直接可以用Id定位到這個元素。但是在有多個元素都擁有這個Id屬性的時候,你通過find_element_by_id只能返回第一個匹配到的元素。
下面的方式也會有同樣的問題,往下就不會贅述這個問題。如果匹配不到的話,會返回NoSuchElementException。
看個例子,網頁代碼如下:
form 元素就可以通過如下方式定位到:
login_form = driver.find_element_by_id('loginForm')
二、通過 Name 定位元素
第二種方式也是很好理解的。還是上面的網頁代碼,如果想過定位到 username & password 兩個元素,就可以通過 find_element_by_name 的方式
username = driver.find_element_by_name('username') password = driver.find_element_by_name('password')
假設網頁代碼中有如下:
可以看到,有兩個元素有同樣的名字屬性。我們通過 find_element_by_name的方式實際只能定位到 Login 。
Login = driver.find_element_by_name('continue')
如果我們想定位到Clear 怎么辦呢? 可以通過 find_elements_by_name 的方式。上面說過通過這種方式返回的是一個list, 那個對應list 第二個元素就是我們要的Clear 了。
Clear = driver.find_elements_by_name('continue')[1]
三、通過 XPath 定位元素
XPath是什么?
Xpath 是一種可以定位XML文件節點的語言。HTML文件作為XML的一種implementation, Selenium 用戶便可以利用這種強大的語言來定位網頁中元素。XPath 不僅只是可以通過簡單的Id和Name屬性來定位元素,它還提供了其他的可能性。
為什么我們要用XPath?
一個主要原因是當你沒有一個合適的id 或者Name 屬性來定位你要查找的元素,你就需要用到這種方式。你可以通過XPath來用絕對路徑定位你要找的元素,或者關聯某個擁有特定Id或者Name的元素。XPath 同樣可以指定元素不是通過Id或者Name的方式而是通過其他屬性。
怎么用XPath?
詳見文章:[Python 應用:爬蟲] Selenium 之 XPath 語法
簡單看一下語法,以有助於后續理解
絕對路徑的XPath可以包含從根節點開始的所有元素,這樣的話,結構樹稍微有調整,就意味着路徑可能失效。通過定位到某個元素再來定位和它有關系的其他元素是我們常用的方式。這樣的話修改的可能性更小。
舉例來說明:
網頁如下
form 這個元素可以通過以下幾種方式來定位:
login_form = driver.find_element_by_xpath("/html/body/form[1]")
login_form = driver.find_element_by_xpath("//form[1]")
login_form = driver.find_element_by_xpath("//form[@id='loginForm']")
第一種是絕對路徑的方式;
第二種是所有Name為form中的第一個元素;
第三種是所有Name為form中Id 屬性為‘loginForm’ 的元素
username 可以通過下面幾種方式來定位
username = driver.find_element_by_xpath("//form[input/@name='username']")
username = driver.find_element_by_xpath("//form[@id='loginForm']/input[1]")
username = driver.find_element_by_xpath("//input[@name='username']")
第一種表達的是,Name 為form 的所有元素中那個有Name為input的子元素,而且該子元素包含username 的name 屬性。
第二種表達的是,name 為from 的所有元素中id為‘loginForm’的那個元素中第一個input子元素。
第三種表達的是,第一個name 為input 而且有name 屬性為'username'的元素。
Clear 按鈕元素可以通過以下幾種方式定位
clear_button = driver.find_element_by_xpath("//input[@name='continue'][@type='button']")
clear_button = driver.find_element_by_xpath("//form[@id='loginForm']/input[4]")
第一個表達的是,Input的所有元素中擁有 name屬性為‘continue’ 和 type屬性為‘button’的那個元素
第二個表達的是,name 為form 的所有元素中id屬性為‘loginForm’的那個元素中的子元素為input 的第四個元素。
四、通過 Link Text 定位超鏈接
如果說知道一個網頁鏈接附屬的鏈接文本,可以通過這種方式來匹配滿足要求的第一個元素。沒有元素匹配到的話,這會返回NoSuchElementException。
下面看個例子,網頁文本如下:
如果說想要定位到 continue.html 這個鏈接,這可以通過如下方式
continue_link = driver.find_element_by_link_text('Continue')
continue_link = driver.find_element_by_partial_link_text('Conti')
五、通過 Tag Name 定位元素
這種方式很好理解,就是通過元素的tag name 來定位元素。如果匹配到的話,則匹配成功的第一個元素會被返回,沒匹配成功的話,
則會返回NoSuchElementException。
下面看個例子,網頁如下:
heading (h1)元素可以通過下面的方式定位
heading1 = driver.find_element_by_tag_name('h1')
六、通過 Class Name 定位元素
這種方式就是通過元素的class name 屬性來定位元素。方式不同,返回結果同上面。
看個簡單例子,網頁如下:
p 元素就可以通過下面的元素定位到
content = driver.find_element_by_class_name('content')
七、通過 CSS 選擇器來定位元素
這種方式就是通過css 選擇器句法的方式來定位元素。這種方式類似XPath ,但css selectors 到底是什么,我們要怎么用 css selectors 呢?
詳情請看文章:[Python 應用:爬蟲] Selelium 之 css selectors
下面只是看個非常簡單的例子,雖然可能根本看不懂咋回事,沒關系,上面鏈接可以拯救你。
p 這個元素可以通過下面的方式定位到
content = driver.find_element_by_css_selector('p.content')