【问题标题】:How to emulate Firefox "Save File" -> OK in Python如何在 Python 中模拟 Firefox“保存文件”-> OK
【发布时间】:2015-02-25 01:16:37
【问题描述】:

我的以下代码:

#!/usr/bin/env python
from selenium import webdriver
from selenium.webdriver.support.ui import Select
from selenium.webdriver.common.by import By

# Define firefox profile
download_dir = "/Users/pdubois/Desktop/TargetMine_Output/"
fp = webdriver.FirefoxProfile()
fp.set_preference("browser.download.folderList",2)
fp.set_preference("browser.download.manager.showWhenStarting",False)
fp.set_preference("browser.download.dir", download_dir)
#fp.set_preference("browser.helperApps.neverAsk.saveToDisk", "text")
fp.set_preference("browser.helperApps.neverAsk.saveToDisk", "text/plain")


driver = webdriver.Firefox(fp)
driver.implicitly_wait(20)

genes  = "Eif2ak2,Pcgf5,Vps25,Prmt6,Tcerg1,Dnttip2,Preb,Polr1b,Gabpb1,Prdm1,Fosl2,Zfp143,Psip1,Kat6a,Tgif1,Txn1,Irf8,Cnot6l,Zfp451,Foxk2,Lpxn,Etv6,Khsrp,Lmo4,Nkrf,Mafk,Mbd1,Cited2,Elp5,Jdp2,Bzw1,Rbm15b,Klf9,Gtf2e2,Dynll1,Klf6,Stat1,Srrt,Gtf2f1,Adnp2,Ikbkg,Mybbp1a,Nup62,Brd2,Chd1,Kctd1,Sap30,Cebpd,Mtf1,Gtf2h2,Fubp1,Tcea1,Irf2bp2,Ezh2,Hnrpdl,Pml,Cebpz,Med7"
targetmine_url = "http://targetmine.nibio.go.jp/targetmine/begin.do"
driver.get(targetmine_url)

# Define type of list to be submitted
gene_select = Select(driver.find_element_by_name("type"))
gene_select.select_by_visible_text(u"Gene")


# Enter list and submit
gene_input = driver.find_element_by_id("listInput")
gene_input.send_keys(genes)
submit = driver.find_element_by_css_selector("input.button.light").click()

# Choose name for list
driver.find_element_by_id("newBagName").clear()
driver.find_element_by_id("newBagName").send_keys("ADX.06.ID.Clust1")

driver.switch_to_frame("__pomme::0")
# Add All
driver.find_element_by_css_selector("span.small.success.add-all.button").click()
# Save all genes
driver.find_element_by_css_selector("a.success.button.save").click()
# Select M. Musculus
driver.find_element_by_xpath("//ul[@id='customConverter']/li[2]/a[1]").click()

# Gene enrchment part
go_xpath  = "//div[@id='gene_go_enrichment-widget']/div[@class='inner']/div[1]/div[@class='form']/form[@style='margin:0']/div[2]/select[1]"
#driver.find_element_by_xpath(go_xpath).click()
go_select = Select(driver.find_element_by_xpath(go_xpath))
go_select.select_by_visible_text(u"1.00")


# Download 
#driver.find_element_by_css_selector("a.btn.btn-small.export").click()

工作正常。以这个实例结束:

我想要实现的最后一件事是自动保存文件。 尽管我已经在顶部设置了 Firefox 配置文件 的代码,它没有像我希望的那样。正确的做法是什么?

更新:

alecxe 的解决方案有效。 除了我试过这个,它不会保存文件。

go_download_xpath  = "//div[@id='gene_go_enrichment-widget']/div[@class='inner']/div[1]/div[2]/a[@class='btn btn-small export']"

driver.find_element_by_xpath(go_download_xpath).click()
# it saved the specific desired file.
# using 
#driver.find_element_by_css_selector("a.btn.btn-small.export").click()
#save the wrong file.

【问题讨论】:

  • 你的更新...它不保存文件...???保存错误的文件...请检查 a.btn.btn-small.export 对于该元素是否唯一...否则它将仅保存单击第一个...

标签: python firefox selenium web selenium-webdriver


【解决方案1】:

试试:

fp = webdriver.FirefoxProfile()
fp.set_preference("browser.download.dir", download_dir)
fp.set_preference("browser.preferences.instantApply", True)
fp.set_preference("browser.helperApps.neverAsk.saveToDisk",
                  "text/plain, application/octet-stream, application/binary, text/csv, application/csv, application/excel, text/comma-separated-values, text/xml, application/xml")
fp.set_preference("browser.helperApps.alwaysAsk.force", False)
fp.set_preference("browser.download.manager.showWhenStarting", False)
fp.set_preference("browser.download.folderList", 2)

driver = webdriver.Firefox(firefox_profile=fp)

【讨论】:

    【解决方案2】:

    这个特定的对话框不能通过 selenium 控制 - 这是一个浏览器弹出窗口,而不是一个 javascript 弹出窗口(可以使用 swith_to.alert 自动化)。

    在这种情况下,您需要首先避免显示弹出窗口,并通过调整浏览器的所需功能(即配置文件首选项)让 Firefox 自动下载文件。 Firefox 可以根据正在下载的文件的 mime-type 自动下载文件。你的情况是text/plain:

    fp = webdriver.FirefoxProfile()
    fp.set_preference("browser.download.folderList",2)
    fp.set_preference("browser.download.dir", download_dir)
    fp.set_preference("browser.download.manager.showWhenStarting", False)
    
    fp.set_preference("browser.helperApps.neverAsk.saveToDisk", "text/plain")
    
    driver = webdriver.Firefox(firefox_profile=fp)
    

    仅供参考,我已手动下载文件并使用magic moduledetect the mime-type

    In [1]: import magic
    
    In [2]: mime = magic.Magic(mime=True)
    
    In [3]: mime.from_file("result.tsv")
    Out[3]: 'text/plain'
    

    【讨论】:

    • 感谢一百万。我有小故障。请看我的更新。
    • @pdubois 感谢您的接受。你解决了最新的问题吗?
    • 是的。是时间问题。我只需添加time.sleep(10) 然后保存。
    • @pdubois 可以,但考虑使用 explicit waits 而不是使用 time.sleep 的硬编码延迟。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-31
    • 2018-08-25
    • 1970-01-01
    • 1970-01-01
    • 2021-11-09
    • 2016-01-08
    相关资源
    最近更新 更多