Selenium+Python:下載文件(Firefox 和 Chrome)

引自  https://blog.csdn.net/Momorrine/article/details/79794146html

1.      環境python

操做系統web

Win10chrome

IDE瀏覽器

Eclipse (Oxygen 4.7)+ PyDev 5.9.2 (JDK1.8)網絡

Pythonapp

3.5工具

Selenium學習

selenium-3.9.0-py2.py3-none-any.whl測試

FirefoxDriver

0.20.0

Firefox瀏覽器

59.0.2(32位)

ChromeDriver

2.34

Chrome瀏覽器

63.0.3239.84

  

2.      Firefox

    這是蟲師書裏面的一個例子,我直接copy下來了

  1. from selenium import webdriver
  2.  
  3. fp = webdriver.FirefoxProfile()
  4. fp.set_preference( "browser.download.folderList", 2)
  5. fp.set_preference( "browser.download.manager.showWhenStarting", False) # 不起做用
  6. fp.set_preference( "browser.download.dir", os.getcwd())
  7. fp.set_preference( "browser.helperApps.neverAsk.saveToDisk", "application/octet-stream")
  8.  
  9. driver = webdriver.Firefox(firefox_profile=fp)
  10. driver.get( "http://pypi.Python.org/pypi/selenium")
  11. driver.find_element_by_partial_link_text( "selenium-3.11.0-py2.py3-none-any").click()

    可是很不幸,我這兒運行了,仍是會彈出確認下載對話框,雖然設置了browser.download.manager.showWhenStarting爲Flase,而因爲Selenium沒法操做該對話框,程序就卡在那兒了沒能下載文件。

 

    我發現確認下載對話框,默認的焦點就在【肯定】上,就試着在代碼的最後添加這樣一句:

ActionChains(driver).key_down(Keys.ENTER).perform()

當這個對話框出現的時候,手動鍵入ENTER是能夠下載的,但這句代碼並無起做用,仍然沒有下載文件。

 

3.      Chrome

    又試着增長了一些等待時間,始終沒成功,就想着先換一個瀏覽器試試吧。

  1. options = webdriver.ChromeOptions()
  2. prefs = { 'profile.default_content_settings.popups': 0, 'download.default_directory': os.getcwd()}
  3. options.add_experimental_option( 'prefs', prefs)
  4.  
  5. driver = webdriver.Chrome(chrome_options=options)
  6. driver.get( "http://pypi.Python.org/pypi/selenium")driver.find_element_by_partial_link_text("selenium-3.11.0-py2.py3-none-any").click()

    對Chrome瀏覽器設置了profile.default_content_settings.popups爲0是起做用的,運行這段代碼,並無彈出確認提示框,文件能夠下載下來。

  

4.      Firefox+Pywin32

總以爲Firefox應該也會有辦法來操做那個確認下載對話框,百度了一下,有提到Pywin32,能夠獲取並操做Windows窗口。那就先安裝一個吧。 

    Pywin32,我是直接在命令行切換到Python根目錄\Scripts下,用pip install pywn32來安裝的:

                          

     此外還用到一個能夠獲取Windows窗口屬性的小工具Sky++,下載瞭解壓縮就能夠用了。運行Sky++後,點擊【搜索】-【窗口搜索】菜單項打開【窗口搜索】對話框

                                            

按住其中的查找程序工具拖動到確認下載對話框後釋放,【窗口搜索】對話框中會顯示該窗口的句柄、標題、類等屬性

                                              

                                            

經過後兩個屬性,就能夠調用win32gui.FindWindow()獲取該窗口的句柄,進而試着操做該窗口。注意 :雖然在Sky++中已經獲得了句柄,但程序中不能直接用,由於每次運行窗口句柄是不一樣的。

     因而我在以前的代碼後面增長了下面這句代碼

dialog = win32gui.FindWindow("MozillaDialogClass", u"正在打開 selenium-3.11.0-py2.py3-none-any.whl")

打印了一下dialog,是有值的,就說明成功地獲取到了窗口句柄了。 

    在獲取到對話框的句柄後,就應該進一步獲取【肯定】按鈕的句柄,而後點擊該按鈕,這樣就應該能夠下載文件了

  1. button = win32gui.FindWindowEx(dialog, None, "Button",None)
  2. win32gui.PostMessage(button, win32con.WM_LBUTTONDOWN, win32con.MK_LBUTTON, 0)
  3. win32gui.PostMessage(button, win32con.WM_LBUTTONUP, win32con.MK_LBUTTON, 0)

但是一直沒成功,打印button一直是0,沒有能獲取到按鈕的句柄,我懷疑是由於類名不正確的緣由,但Sky++上沒法看到按鈕的信息,將類名換了又換,或許是"MozillaButtonClass",但始終沒有獲取。

    轉而我又想,既然對話框獲取到了,那對對話框鍵入ENTER呢,或許就能夠了

win32gui.SendMessage(dialog,win32con.WM_KEYDOWN, win32con.VK_RETURN, 0)

嗯,真的能夠了。所以用Firefox下載文件的完整代碼是

  1. from selenium import webdriver
  2. import win32gui, win32con
  3.  
  4. fp = webdriver.FirefoxProfile()
  5. fp.set_preference( "browser.download.folderList", 2)
  6. fp.set_preference( "browser.download.dir", os.getcwd())
  7. fp.set_preference( "browser.helperApps.neverAsk.saveToDisk", "application/octet-stream")
  8.  
  9. driver = webdriver.Firefox(firefox_profile=fp)
  10. driver.get( "http://pypi.Python.org/pypi/selenium")
  11. driver.find_element_by_partial_link_text( "selenium-3.11.0-py2.py3-none-any").click()
  12.  
  13. dialog = win32gui.FindWindow( "MozillaDialogClass", u"正在打開 selenium-3.11.0-py2.py3-none-any.whl")
  14. win32gui.SendMessage(dialog,win32con.WM_KEYDOWN, win32con.VK_RETURN, 0)

    只是有一個問題,在import win32gui和win32con時,會有錯誤標識

但運行沒問題,不知道爲何。。。。。。 

    還要注意的是,須要根據當前網絡的情況,以及下載文件的大小,適當添加一些等待時間,否則會可能出現最後關閉瀏覽器驅動時文件還沒下完的狀況。

5.      再次Firefox

    以上那些是昨天寫的,是到昨天晚上爲止的認識。今兒早上來了,在搜另一個問題的時候,發現有博文說Firefox不能下載的緣由,極可能是由於"browser.helperApps.neverAsk.saveToDisk"設置的文件類型不對的緣故,我把那個例子裏面的類型"binary/octet-stream"貼過來試了一下,果真是能夠的。但關於browser.download.manager.showWhenStarting設置爲Flase不彈出提示框,其實代碼中把文件類型設置正確了,沒有設置browser.download.manager.showWhenStarting,也並無彈出提示框。

  1. from selenium import webdriver
  2.  
  3. fp = webdriver.FirefoxProfile()
  4. fp.set_preference( "browser.download.folderList", 2)
  5. fp.set_preference( "browser.download.dir", os.getcwd())
  6. fp.set_preference( "browser.helperApps.neverAsk.saveToDisk", "binary/octet-stream")
  7.  
  8. driver = webdriver.Firefox(firefox_profile=fp)
  9. driver.get( "http://pypi.Python.org/pypi/selenium")
  10. driver.find_element_by_partial_link_text( "selenium-3.11.0-py2.py3-none-any").click()
 

    有朋友友情提示,該加個參考資料小節。之前寫東西的時候卻是每次都有注意引用這個問題,而最近寫的也只是記錄本身的一個學習Selenium+Python Web自動化測試的過程。不過好習慣仍是該保持,這篇已經不太記得本身到底搜了哪些文章了,就記下幾篇還記得的吧。

 

6.      參考資料

[1]  《Selenium2自動化測試實戰:基於Python語言》蟲師編著 電子工業出版社 2016年1月

[2] 用selenium的webdriver下載文件(基於python,firefox和chrome) https://blog.csdn.net/cyjs1988/article/details/74988997

[3]   Selenium 設置瀏覽器下載  http://www.cnblogs.com/fnng/p/7700620.html

相關文章
相關標籤/搜索