python 打开网页 并填表单_Windows下使用python3 + selenium.webdriver功能实现自动填写网页表单功能...
因?yàn)楣ぷ髟?#xff0c;需要將xls文件的數(shù)據(jù)錄入到網(wǎng)上。因?yàn)閿?shù)據(jù)量太多,而且以后時(shí)不時(shí)還需要用上,Ctrl+C,Ctrl+V不是長(zhǎng)久之計(jì)。所有寫了一個(gè)小工具,用于把xls文件的數(shù)據(jù)錄入到網(wǎng)站上。
讀寫xls部分省略。
要實(shí)現(xiàn)填寫表單,需要:
1.python的selenium庫(kù)。
2.Chrome瀏覽器
3.與谷歌瀏覽器版本對(duì)應(yīng)的chromedriver,下載地址:http://npm.taobao.org/mirrors/chromedriver/
一、配置chromedriver
2)下載后解壓,并把chromedriver.exe拷貝到Chrome瀏覽器所在目錄,如圖所示:
3)為了方便,我們也可以把Chrome路徑添加到系統(tǒng)環(huán)境變量中:
到此,chromedriver就配置完畢啦。
二、Python安裝selenium庫(kù)
使用如下命令即可完成安裝:
pip3 install selenium
如圖:
三、測(cè)試selenium庫(kù)使用
編輯如下代碼,實(shí)現(xiàn)打開百度頁面并搜索“cnblogs”的簡(jiǎn)單功能(后續(xù)講解代碼中id的來源):
importosfrom selenium importwebdriverdeftest():
driver= webdriver.Chrome("chromedriver.exe") #chromedriver所在路徑
driver.get(r"http://www.baidu.com")
driver.find_element_by_id("kw").send_keys("cnblogs") #輸入cnblogs
driver.find_element_by_id("su").click() #點(diǎn)擊“百度一下”搜索
if __name__ == "__main__":
test()
os.system("pause")
測(cè)試完成,接下來就可以使用了。
四、selenium的使用
selenium提供了多種定位網(wǎng)頁元素的方法,如通過id、name、classname、xpath等多種方式。詳細(xì)請(qǐng)參考:http://www.testclass.net/selenium_python/find-element/,這里就不一一贅述了。
到此,我們就已經(jīng)幾乎做好填寫表單的所有準(zhǔn)備啦,最后一步,就是定位我們的目標(biāo)網(wǎng)站的具體元素并實(shí)現(xiàn)填表了。
五、定位網(wǎng)頁元素
chrome開發(fā)者工具為我們提供了非常遍歷的方式定位網(wǎng)頁元素。我們以定位百度首頁的文本輸入框以及“百度一下”按鈕為例:
1、打開Chrome瀏覽器,按F12打開開發(fā)者工具。點(diǎn)擊進(jìn)入“Elements”板塊,我們就能看到網(wǎng)頁完整的HTML代碼。如圖:
2.點(diǎn)擊開發(fā)者工具左上角的小按鈕來定位頁面元素,我們定位文本輸入框找到輸入框?qū)?yīng)的元素id,當(dāng)然,我們也可以通過其他值來定位,如圖:
接下來我們定位百度按鈕:
從這里我們看到,文本輸入框的id是“kw”,百度一下按鈕的id是su,有了如上信息,我們就可以寫出第三大點(diǎn)的代碼了。
六、實(shí)踐中遇到的一些問題:處理批量填單時(shí)拋出異常:selenium.common.exceptions.ElementClickInterceptedException: Message: element click intercepted
對(duì)于批量數(shù)據(jù)的填寫,常常需要我們點(diǎn)擊按鈕增加填寫區(qū)域。如下圖示例
通過開發(fā)者工具,我們定位到該按鈕元素,三個(gè)按鈕屬于同一個(gè)類,class=“addbutton”:
假設(shè)我們已經(jīng)定位到改行元素row_element,接下來我們就開始實(shí)現(xiàn)代碼吧:
1)第一版
我們通過row_element定位到第二個(gè)addbutton按鈕并點(diǎn)擊,代碼如下:
通過以上方式,我們實(shí)現(xiàn)了自動(dòng)添加一行填表區(qū)域的邏輯。
但是事與愿違,當(dāng)我用這種方式批量填表時(shí),填表途中拋出了異常:
selenium.common.exceptions.ElementClickInterceptedException: Message: element click intercepted: Element is not clickable at point (737, 833). Other element would receive the click:
(Session info: chrome=77.0.3865.90)
大概意思就是被其他元素?cái)r截了。只能再找新的辦法。
各種查資料,結(jié)果就出現(xiàn)了第二版代碼。
2)第二版
將第一版代碼稍作修改,使用JavaScript腳本執(zhí)行,如圖:
print("添加一條填表區(qū)...")
add_buttons= row_element.find_elements_by_class_name('addbutton')#add_buttons[1].click()
driver.execute_script("arguments[0].click()", add_buttons[1])
View Code
經(jīng)過修改,再也沒有出現(xiàn)剛剛的報(bào)錯(cuò)了~
3)第三版,繼續(xù)改進(jìn)
隨著自己對(duì)JavaScript和HTLM的進(jìn)一步熟悉,重新看了一下發(fā)現(xiàn)自己繞了個(gè)大彎,其實(shí)完全有更簡(jiǎn)單的方法實(shí)現(xiàn)。
筆者原本的邏輯,是通過各種方式定位到了該行元素,再定位到具體按鈕,進(jìn)而使用click()實(shí)現(xiàn)。
但是我們回頭看一下HTLM源碼,如下:
我們可以看到,其實(shí)click時(shí)間就是響應(yīng)了一個(gè)postInsert()函數(shù)!
我們直接使用driver.execute_script()調(diào)用postInsert()函數(shù)就可以了,完全不需要定位元素位置呀,不!需要!定位!呀!呀!
postInsert()函數(shù)接受一個(gè)整型值,代表在第幾行的后面插入新行。對(duì)代碼稍作修改,就有了第三版代碼,一行就搞定了:
至此,工具就寫完了,筆者這幾天是從0基礎(chǔ)了解HTML、JavaScript開始,一步一步加深認(rèn)識(shí),并把工具寫好,碰到的坑,數(shù)不盡數(shù)。但是收獲也很大,繼續(xù)加油吧!
總結(jié)
以上是生活随笔為你收集整理的python 打开网页 并填表单_Windows下使用python3 + selenium.webdriver功能实现自动填写网页表单功能...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python qt教程_Python -
- 下一篇: python packages_Pyth