這樣教都不會?還得我親自出馬!
本文轉(zhuǎn)載自微信公眾號「Python技術(shù)」,作者派森醬。轉(zhuǎn)載本文請聯(lián)系Python技術(shù)公眾號。
上次說到了還有別的方法能找到搜索框嗎?答案是當然有了。而且為了滿足大部分場景,有很多方法可以定位元素。今天就來繼續(xù)跟大家一起學習下 Python 如何使用 Selenium 進行自動化操控瀏覽器。
定位元素
如果想操作一個網(wǎng)頁上面的一個元素,無論點擊、輸入、拖拽等等任何操作,第一步就是定義元素。因為每個元素對象又包含很多個屬性,所以我們就能通過這些屬性一項或幾項輕松的找到它。
以下是幾種常用的定位元素的方法:
- find_element_by_id():通過元素的 id 屬性來定位,這是最常見的定位方式,一般網(wǎng)頁包含的所有元素中,id 屬性是唯一的,定位速度快而且準確,首選推薦。
- find_element_by_name():通過元素的 name 屬性來定位,這是次要推薦方式,有些元素沒有 id ,但基本都有 name,但可能存在重名。
- find_element_by_class_name():通過元素的 class 屬性來定位,一般 HTML 中元素都會有 class 用來做樣式描述。
- find_element_by_link_text():這個是通過 對應(yīng)的鏈接文本對象來定位的,僅用于文本有超鏈接的時候。
- find_element_by_partial_link_text():同 find_element_by_link_text() 相似,但可以只是超鏈接文本的一部分。
- find_element_by_tag_name():可以通過元素的 tag name 來定位,但這個很容易會重復,同時返回多個元素。
- find_element_by_css_selector():這個是通過 css 來定位的。CSS 是一種樣式表語言,用來渲染元素樣式的,是網(wǎng)頁元素的重要組成部分。
- find_element_by_xpath():這是一種可以通過 HTML 結(jié)構(gòu)進行定位,可以通過根節(jié)點開始一層層定位,找到最終的元素。但這種方式在文檔結(jié)構(gòu)產(chǎn)生變化的時候可能會失效,所以不太推薦。
這么多的定位方法,基本上就能滿足大部分場景的需求了。還有一些其他的方法這里就不再說了。
下面我把這些定位的例子列出來,大家就能知道該如何使用:
- // 導入 webdriver
- from selenium import webdriver
- // executable_path 用于指定driver存放路徑
- browser = webdriver.Chrome(executable_path='/Users/xx/python/chromedriver')
- // 打開百度頁面
- browser.get('https://wwww.baidu.com/')
- // 在搜索框內(nèi)輸入 `python selenium` 并點搜索返回結(jié)果
- browser.find_element_by_id("kw").send_keys("python selenium")
- // name 屬性定位
- browser.find_element_by_name("wd").send_keys("python selenium")
- // class name 屬性定位
- browser.find_element_by_class_name("s_ipt").send_keys("python selenium")
- // 鏈接 text 屬性定位
- browser.find_element_by_link_text("關(guān)于百度").click()
- // tag name 屬性定位
- browser.find_element_by_tag_name("input").send_keys("python selenium")
- // CSS 方式定位
- browser.find_element_by_css_selector("#kw").send_keys("python selenium")
- // xpath 方式定位
- browser.find_element_by_xpath("//input[@id='kw']").send_keys("python selenium")
- // 點擊 百度一下 按鈕
- browser.find_element_by_id("su").click()
元素是定位到了,接下來就是看要如何操作元素對象了
操作元素
上面我們說了元素是怎么定位找到的,那定位找到元素以后,我們又能對它進行什么操作呢,下面我就來一個個說下:
- send_keys():這是最常用的,就是對元素模擬按鍵操作,輸入你參數(shù)中傳入的字符串,主要用來操作文本輸入框時使用。
- click():這個方法也是比較常用的,就是對元素對象進行鼠標單擊操作,主要用來操作按鈕或超鏈接文本時使用。
- submit():如果是操作表單,則可以調(diào)用這個方法進行表單內(nèi)容提交。
- clear():如果對象有可以清除的內(nèi)容,比如文本輸入框,則清除已輸入的內(nèi)容。
- text():這個方法主要用來獲取元素的文本內(nèi)容。
操作實例
好了,上面介紹那么多,現(xiàn)在我們來看一個實際的例子:
讓瀏覽器自動輸入 https://www.jd.com/,打開京東官網(wǎng),然后搜索 ps5國行,并把搜索出來商品的名稱和金額打印出來。
例子不復雜,我們直接來看代碼:
- # 導入庫
- from selenium import webdriver
- import time
- # executable_path 用于指定driver存放路徑
- browser = webdriver.Chrome(executable_path='/Users/xx/python/chromedriver')
- # 打開京東官網(wǎng)
- browser.get('https://www.jd.com/')
- # browser.find_element_by_id("kw").send_keys("python selenium")
- # 獲取輸入框?qū)ο?nbsp;
- search = browser.find_element_by_xpath('//*[@id="key"]')
- # 輸入想要搜索的關(guān)鍵詞,如"ps5國行"
- search.send_keys('ps5國行')
- # 獲取搜索按鈕對象并單擊
- browser.find_element_by_xpath('//*[@id="search"]/div/div[2]/button').click()
- # 將滾動條移動到頁面底部,用于加載所有信息
- javascript = "var q=document.documentElement.scrollTop=50000"
- # 執(zhí)行 javascript 移動滾動條
- browser.execute_script(javascript)
- # 等待3秒,有些異步加載的數(shù)據(jù)加載慢
- time.sleep(3)
- # 通過查看頁面源碼得到金額的 xpath 路徑,并獲取金額
- prices = browser.find_elements_by_xpath('//*[@id="J_goodsList"]/ul/li/div/div[2]/strong/i')
- # 通過查看頁面源碼得到商品標題的 xpath 路徑,并獲取商品標題
- names = browser.find_elements_by_xpath('//*[@id="J_goodsList"]/ul/li/div/div[3]/a/em')
- # 遍歷打印出當前頁所有標題和金額
- for name,price in zip(names,prices):
- print(name.text.replace('\n',''),price.text)
- #退出瀏覽器
- browser.quit()
代碼中我已經(jīng)對每一行做了注釋,讓大家能看明白每一行都是做什么的。接下來我們直接運行代碼 python test.py,可以看到瀏覽器自動啟動后,執(zhí)行相關(guān)操作,然后退出,下面是執(zhí)行中的截圖:
執(zhí)行完成后,我們可以看到控制臺已經(jīng)打印出來相應(yīng)信息:
總結(jié)
好了,今天我們又介紹了下 selenium 定位元素的多種方法,以及我們找到元素后,可以對它進行什么操作。并寫了一個自動化操作的簡單例子,給大家學習參考,后續(xù)還會為大家介紹更多。