目錄
1. 初始化瀏覽器對象和訪問頁面
2. 查找節點及節點交互
2.1 查找單個節點
(1)獲取方法1——特定方法
(2)通用方法
2.2 查找多個節點
2.3 節點交互
3. 動作鏈
4. 執行 JavaScript 之下拉進度條
5.?獲取節點信息
5.1 獲取屬性
5.2?獲取文本值
5.3?獲取 ID、位置、標簽名、大小
1. 初始化瀏覽器對象和訪問頁面
from selenium import webdriverbrowser = webdriver.Chrome() # 初始化瀏覽器對象
browser.get('https://www.taobao.com/') # 訪問淘寶頁面
print(browser.page_source) # 得到頁面源代碼
browser.close()
? ? ? ? 運行代碼,之后會自動彈出窗口,并訪問淘寶,輸出網頁HTML代碼。
2. 查找節點及節點交互
? ? ? ? Selenium可以驅動瀏覽器完成各種操作,例如填充表單、模擬點擊、輸入等。但想要點擊、輸入等需要找到輸入的地方即節點,之后點擊、輸入即節點交互。
2.1 查找單個節點
????????下面我們以淘寶網為例:
? ? ? ? 這是個輸入的表單節點,之后我們獲取它。可以發現這個input節點 id屬性為 'q',name='q'等等,我們可以通過其屬性去獲取節點(屬性多種,獲取方式也多種)。
(1)獲取方法1——特定方法
? ? ? ? 以下是所有特定方法:
browser.find_element_by_id('')
browser.find_element_by_name('')
browser.find_element_by_css_selector('') # CSS選擇器
browser.find_element_by_xpath('')
browser.find_element_by_link_text('')
browser.find_element_by_partial_link_text('')
browser.find_element_by_tag_name('')
browser.find_element_by_class_name('')
(2)通用方法
????????find_element(查找方法,方式的取值),使用這個最好先from selenium.webdriver.common.by import By,方便使用。
from selenium import webdriver
from selenium.webdriver.common.by import Bybrowser = webdriver.Chrome() # 初始化瀏覽器對象
browser.get('https://www.taobao.com/') # 訪問淘寶頁面
inputElement1 = browser.find_element_by_id('q')
# inputElement11 = browser.find_element(By.ID, 'q') # 通用方法
inputElement2 = browser.find_element_by_css_selector('#q')
inputElement3 = browser.find_element_by_xpath('//*[@id="q"]')
print(inputElement1, inputElement2, inputElement3) # 三個值相同browser.close()
2.2 查找多個節點
? ? ? ? 例如下面的導航條:
獲取方法:在前面單個節點的兩個獲取方法的element加s即可,返回的是個列表。
from selenium import webdriverbrowser = webdriver.Chrome() # 初始化瀏覽器對象
browser.get('https://www.taobao.com/') # 訪問淘寶頁面
inputElement = browser.find_elements_by_css_selector('.nav-hd li')
print(inputElement)browser.close()
2.3 節點交互
? ? ? ? 現要瀏覽器自動去淘寶搜索ipad,我們需要先驅動瀏覽器打開淘寶,獲取輸入框節點,再使用send_keys方法輸入文字,獲取搜索按鈕節點,用 click 方法點擊按鈕。
from selenium import webdriver
from selenium.webdriver.common.by import Bybrowser = webdriver.Chrome() # 初始化瀏覽器對象
browser.get('https://www.taobao.com/') # 訪問淘寶頁面
inputElement = browser.find_element_by_id('q') # 獲取輸入框節點
inputElement.send_keys('ipad') # 輸入文字
findButton = browser.find_element_by_css_selector('.search-button button')
# 獲取搜索按鈕節點
findButton.click() # 點擊按鈕
? ? ? ? 運行程序,可以看到過程。因為沒有登陸,所以會停留在登陸頁面。更多操作可看官方文檔介紹:7. WebDriver API — Selenium Python Bindings 2 documentation。
3. 動作鏈
? ? ? ? 在前面,交互操作都是針對某個節點執行的。還有一些操作妹紙特定的執行對象,比如鼠標拖拽、鍵盤按鍵等,需要用另一種方式執行,那就是動作鏈。
? ? ? ?例如,可以這樣實現拖拽節點的操作,將某個節點從一處拖拽至另一處:
實例鏈接:菜鳥教程在線編輯器
現用代碼實現拖拽:
from selenium import webdriver
from selenium.webdriver import ActionChainsbrowser = webdriver.Chrome()
url = 'http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable'
browser.get(url)
browser.switch_to.frame('iframeResult')
source = browser.find_element_by_css_selector('#draggable')
target = browser.find_element_by_css_selector('#droppable')
actions = ActionChains(browser)
actions.drag_and_drop(source, target)
actions.perform()
? ? ? ?browser.switch_to.frame('iframeResult')用于內嵌,使之后的source能嵌入target,因為要凸顯效果,特定加入。
????????依次選中要拖曳的節點source和拖曳到的目標節點target,接著聲明 ActionChains 對象并將其賦值為 actions 變量,然后通過調用 actions 變量的 drag_and_drop() 方法,再調用 perform() 方法執行動作,此時就完成了拖曳操作。
結果:
更多的動作鏈操作可以參考官方文檔的動作鏈介紹:7. WebDriver API — Selenium Python Bindings 2 documentation
4. 執行 JavaScript 之下拉進度條
????????對于某些操作,Selenium API 并沒有提供。比如,下拉進度條,它可以直接模擬運行 JavaScript,此時使用 execute_script() 方法即可實現(雙引號中為固定代碼,多個網站都適用),代碼如下:
from selenium import webdriverbrowser = webdriver.Chrome()
# browser.get('https://www.zhihu.com/explore')
browser.get('https://news.baidu.com/')
browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')
browser.execute_script('alert("To Bottom")')
????????有了這個方法,基本上 API 沒有提供的所有功能都可以用執行 JavaScript 的方式來實現了。
5.?獲取節點信息
????????前面說過,通過 page_source 屬性可以獲取網頁的源代碼,接著就可以使用解析庫(如正則表達式、Beautiful Soup、pyquery 等)來提取信息了。
????????不過,既然 Selenium 已經提供了選擇節點的方法,返回的是 WebElement 類型,那么它也有相關的方法和屬性來直接提取節點信息,如屬性、文本等。這樣的話,我們就可以不用通過解析源代碼來提取信息了,非常方便。
接下來,就看看通過怎樣的方式來獲取節點信息吧。
5.1 獲取屬性
????????可以使用 get_attribute() 方法來獲取節點的屬性,但是其前提是先選中這個節點,示例如下:獲得百度這個logo的class屬性。
from selenium import webdriverbrowser = webdriver.Chrome()
url = 'https://www.baidu.com/'
browser.get(url)
baiduLogo = browser.find_element_by_id('lg')
print(baiduLogo)
print(baiduLogo.get_attribute('class'))
輸出:<selenium.webdriver.remote.webelement.WebElement(session="ae1b17e9e092f2155263522772036f37", element="f.25E08F3EDDDDC250A5E5784201893A30.d.2BB430665B7C306121BC019488525624.e.10")>
s-p-top
5.2?獲取文本值
????????每個 WebElement 節點都有 text 屬性,直接調用這個屬性就可以得到節點內部的文本信息。
from selenium import webdriverbrowser = webdriver.Chrome()
url = 'https://www.baidu.com/'
browser.get(url)
content = browser.find_element_by_class_name('title-content-title')
print(content.text)
browser.close()# 輸出:
# 大力推動我國新能源高質量發展
5.3?獲取 ID、位置、標簽名、大小
? ? ? ? 上述同樣的方法,找到獲取節點,用屬性即可。
節點.id
節點.location
節點.tag_name
節點.size
本人新手,若有錯誤,歡迎指正;若有疑問,歡迎討論。若文章對你有用,點個小贊鼓勵一下,謝謝,一起加油吧!