亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術文章
文章詳情頁

用python-webdriver實現自動填表的示例代碼

瀏覽:23日期:2022-06-30 08:32:54

 在日常工作中常常需要重復填寫某些表單,如果人工完成,費時費力,而且網絡延遲令人十分崩潰。如果能夠用程序實現自動填表,效率可以提高一倍以上,并且能夠移植到多臺計算機,進一步提高工作效率。webdriver是python的selenium庫中的一個自動化測試工具,它能完全模擬瀏覽器的操作,無需處理復雜的request、post,對爬蟲初學者十分友好。

一、環境配置

python3.6+selenium庫+xlrd庫+xlwt庫

其中xlrd和xlwt庫用于讀寫excel表中的數據。

還要下載一個瀏覽器的driver文件用于打開瀏覽器,注意要選擇與計算機系統相符合的版本(max/windows64位/windows32位)

ChromeDriver:http://npm.taobao.org/mirrors/chromedriver/

  IEDriver:http://selenium-release.storage.googleapis.com/index.html

將下載下來的driver.exe放到瀏覽器根目錄和python的根目錄

二、打開網頁

以IE瀏覽器為例,以下兩行代碼就可以實現打開一個IE瀏覽器并且訪問我們需要填表的網站

driver= webdriver.Ie()driver.get(’http://xxxx.com/’)

如果網站需要登陸(需要填表的一般是公司內部網站),再寫一個login函數,將driver作為參數調用

driver = login(driver)

注意一定要將driver傳回,這樣driver才能繼續接受程序的指令

三、元素定位

webdriver的工作原理是找到網頁中某一個元素,可以對其進行填入數據或點擊等操作。

關于元素定位可以參考這篇博客

我主要用到的元素定位方式有

driver.find_element_by_id(’someid’)#通過元素的id定位driver.find_element_by_css_selector('input[value=’確定’')#查找一個input元素,它的value屬性值為’確定’driver.find_element_by_xpath('//span[contains(@style,’COLOR: red’)]/span[1]')#查找一個style屬性值為’COLOR:red’的span元素的第一個span子元素 (1)通過id定位

如果我們想在網頁表單的某一個位置填某項值或者點擊某個按鈕,我們首先要用開發者工具查看這個元素的源代碼,然后首先觀察它有沒有id,如果有id,直接用id定位該元素。然后,用

driver.find_element_by_id(’someid’).click()#點擊元素driver.find_element_by_id(’someid’).send_keys(’somekeys’)#填入’somekeys’driver.find_element_by_id(’someid’).clear()#清空輸入框中已有的值

實現我們想要做的操作。

(2)通過ccs selector定位

如果我們想要操作的元素沒有ID,那么我們就要找到它跟網頁其他元素不同的特征,ccs selector是一種十分靈活的定位方式,其中用value定位是一個不錯的選擇。以

driver.find_element_by_css_selector('input[value=’確定’')

為例,雙引號中的input可以換成任何網頁元素(div、span、input、a等),中括號中是該元素的某一個屬性(style、id、value、class等),等號后面是該屬性的值。

注意,如果網頁中有多個元素同時滿足ccs selector的條件,如有多個value=“確定” 的input,那么find_element_by_css_selector只會定位到在html源代碼中最靠前的一個,而find_elements_by_css_selector會找到源代碼中所有滿足條件的元素,并以列表的形式返回這些找到的元素。例如,網頁中彈出很多個提示框,我們要一一去點確定,可以這樣操作

list=driver.find_elements_by_css_selector('input[value=’ 確定 ’]')for l in list:l.click()

但是,如果這些提示框是重疊出現的,而最上層的提示框實際上在源碼中更靠后的位置,那么列表中第一個“確定”元素就會被疊在上面的提示框遮擋,無法點擊,這個時候倒序一下數組就可以了,從最后一個“確定”元素開始點擊

query=driver.find_elements_by_css_selector('input[value=’ 確定 ’]')for q in query[::-1]:q.click()(3)通過xpath定位

xpath定位比較復雜但是非常全面,當這個元素的class、style屬性和其他元素一樣,實在沒什么特點可以一步定位的時候,我們就可以用xpath,先找到我們想要的元素的父子兄弟元素,再定位到我們想要的元素。例如

driver.find_element_by_xpath(’//*[@class='submit clear']/input[1]’).click()text =driver.find_element_by_xpath('//input[@value=’ 確定 ’]/../preceding-sibling::div[1]').textdriver.find_elements_by_xpath('//span[contains(@style,’COLOR: red’)]/span[1]')

引號中的//表示相對定位,表示從源代碼中任何地方開始尋找。

//后可以跟任何元素,*代表任意元素,即定位符合屬性篩選任何元素。

中括號內是屬性的篩選條件,@后可以加任意屬性。contains(@style,’COLOR: red’)表示的篩選條件是:style屬性中包含”COLOR:red“。這里為什么不直接用@style=’COLOR: red’

的原因是,可能在我們審查源代碼的時候這個元素的style屬性只有’COLOR: red’這一條,但是動態界面的style屬性經常變化,程序運行時直接用等于是定位不到這個元素的。

我們通常需要靠先找到某個有id的元素,再通過層級關系定位到我們真正想要定位的元素,關于兄弟父子元素定位請參考https://www.jb51.net/article/92673.htm

/.. 可以定位這個元素的父親元素

/ 可以定位這個元素的子元素

/preceding-sibling:: 可以定位這個元素的哥哥元素

/following-sibling:: 可以定位這個元素的弟弟元素

如/input[1]表示子元素中第一個input、/../preceding-sibling::div[1]表示父元素的哥哥元素中的第一個div

(4)通過當前節點定位

有時候我們會遇到需要判斷一下元素當前的狀態(是否被選擇)再決定接下來的操作的情況,這時就需要用一個變量來保存當前節點

LTE=driver.find_element_by_xpath('//input[@id=’LTE’]/../span[1]'

然后再用get_attribute獲得當前節點元素的屬性,在這個例子里,如果元素為藍色,就不需要點擊。代碼實現為:

if LTE.get_attribute('style')=='COLOR: blue': pass else: LET.click()

需要篩選出特定文本的情況:

red=driver.find_elements_by_xpath('//span[contains(@style,’COLOR: red’)]/span[1]')#找出所有紅色的文本 for r in red: if ’低消’ in r.text:#如果文本信息中包含‘低消’ r.find_element_by_xpath('./../preceding-sibling::input[1]').click()#注意從當前節點定位的時候要以‘./’開頭 break

如果尋找的元素需要滾動界面才能看到,這個時候可以用js聚焦此元素,頁面便會滾動到該元素的位置

target=driver.find_element_by_css_selector('input[value=’ 確定 ’]') driver.execute_script('arguments[0].scrollIntoView();', target) target.click()四、不確定情況處理 (1)有可能出現的彈窗

在填表過程中,有些地方有可能出現一個彈框也有可能不出現,這個時候,無論這個彈窗是什么,用try..except語句處理就可以解決

js觸發的彈窗:

try: driver.find_element_by_css_selector('input[value=’ 確定 ’]').click() except Exception as e: pass

網頁alert彈窗:

try: driver.switch_to.alert.dismiss() except Exception: pass

dismiss()對應的是alert彈窗的”取消“項,accept()對應的是”確定“項,driver.switch_to.alert.text 可以獲得彈窗的文本內容。

(2)數量不定的彈窗

對上文提到的多個提示框情況,除了用 query=driver.find_elements_by_css_selector('input[value=’ 確定 ’]') 一次性找到所有元素再順序或倒序點擊之外,還可以用一個while循環解決

while(1): try: driver.find_element_by_css_selector('input[value=’ 確定 ’]').click() except Exception as e: break (3)網絡延遲

有些網頁在點擊查詢信息之后需要加載一段時間,加載中的頁面是找不到我們接下來想找的元素的,因此程序就會報錯,此時有兩種解決方法。

一種是固定等待一段時間,等待網頁加載完畢,這種方法的缺點是很難找到等待的最佳時間,太短的話頁面還沒加載完,太長就影響效率

time.sleep(2)

另一種是用一個while循環一直尋找下一個我們要找的元素

while(1): try: driver.find_element_by_id(’continueTrade’).click() break except Exception: pass

這種方法的前提是下一個要找的元素必定會出現

五、frame處理

關于frame處理這篇博客寫得非常好https://www.jb51.net/article/203425.htm

總結起來就是:frameset不用切,frame層層切。最好一系列填表操作完后都用 driver.switch_to.default_content() 回到原文檔,這樣不容易混亂

這里再補充一點frame沒有id時的切入方法

frame= self.driver.find_element_by_xpath('/html/body/div[12]/iframe')#先定位frame位置,用一個變量儲存這個節點 self.driver.switch_to_frame(frame)#再切入這個節點六、excel數據讀寫

excel數據讀寫十分簡單,看代碼就好了:

def read(file): data = xlrd.open_workbook(file)#打開excel文件 table = data.sheets()[0]#讀取第一個sheet的數據 phones = table.col_values(0)#以列表形式存儲第一列數據 peoples = table.col_values(1)#以列表形式存儲第二列數據 return phones,peoplesdef write(result): file=xlwt.Workbook()#創建一個excel文件 table = file.add_sheet(’sheet1’)#添加一個sheet for i in range(len(result)):#寫入數據 table.write(i,0,result[i][0]) table.write(i,1,result[i][1]) table.write(i,2,result[i][2]) file.save(’result.xls’)

到此這篇關于用python-webdriver實現自動填表的示例代碼的文章就介紹到這了,更多相關python webdriver 自動填表內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 精品三级网站 | 欧美伦理片在线观看 | 五月天六月婷婷开心激情 | 自拍啪啪| 高h喷水荡肉爽文各种场合 高h辣肉各种姿势爽文bl | 国产在线观看免费不卡 | 一 级 黄 中国色 片 | 一本久道热中字伊人 | 男女晚上爱爱的视频在线观看 | 欧美黄色第一页 | 性欧美视频a毛片在线播放 性欧美视频在线观看 | 伊人久久大香焦 | 亚洲精品国产美女在线观看 | 高清在线亚洲精品国产二区 | chinese在线| 黄网在线观看网址入口 | 免费久久精品视频 | 韩日中文字幕 | 黄色一级免费观看 | 激情丝袜欧美专区在线观看 | 国产乱人视频免费观看 | 黄色片视频在线观看 | 亚洲不卡视频 | 国产又黄又免费aaaa视频 | 美女黄污网站 | 男女性高爱潮免费网站 | 精品日韩欧美一区二区三区在线播放 | 中文字幕欧美日韩在线不卡 | 久久99国产精一区二区三区! | 中国的毛片 | 久久精品国产99国产精偷 | 男女交性高清全过程无遮挡 | 黄色大片在线观看 | 国内自拍在线观看 | 国产91福利在线精品剧情尤物 | 毛片三 | 日韩在线中文 | 最近免费中文字幕大全免费版视频 | a毛片在线播放 | 2021久久精品国产99国产 | 国产视频一区在线 |