使用 Selenium 通过 PhantomJS 中的超链接下载文件

Download file via hyperlink in PhantomJS using Selenium

我正在使用 selenium 在加载到特定页面的 hyperlink 上执行点击功能。该脚本适用于 google chrome,但不适用于 phantomjs。为什么这不起作用?

from selenium import webdriver

driver = webdriver.Chrome()   
#driver = webdriver.PhantomJS(executable_path = "/Users/jameslemieux/PythonProjects/phantomjs-1.9.8-macosx/bin/phantomjs")

driver.get("http://www.youtube-mp3.org/?e=t_exp&r=true#v=hC-T0rC6m7I")

elem = driver.find_element_by_link_text('Download')
elem.click()


driver.save_screenshot('/Users/jameslemieux/Desktop/Misc./test_image.png')

driver.quit()

这在chrome中有效,但它总是打开一个新的chrome window来完成任务。我读到我应该在幕后使用 phantomjs 运行,但是当我将驱动程序切换到 phantomjs 时,下载似乎无法完成。屏幕截图抓取,它确实在正确的页面上,'Download' 肯定在那里。所以

elem.click()

没有做它应该做的事情,或者它正在点击,但是 phantomjs 不知道如何处理直接下载 link。请帮助,我已经连续几个小时了。

由于 PhantomJS 永远不会继续下载请求,我们需要手动下载文件。

这里的想法是点击"Convert"按钮,wait for the "Download" link to appear, get the href attribute, containing the link to the generated mp3 file, and download it via urllib.urlretrieve():

import urllib
from urlparse import urljoin

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

base_url = 'http://www.youtube-mp3.org/'

driver = webdriver.PhantomJS()
driver.get("http://www.youtube-mp3.org/?e=t_exp&r=true#v=hC-T0rC6m7I")

# convert the video to mp3
driver.find_element_by_id('submit').click()

# wait for download link to appear
element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.LINK_TEXT, "Download")))
link = element.get_attribute('href')
url = urljoin(base_url, link)

# download the song
urllib.urlretrieve(url, 'song.mp3')

driver.quit()

# enjoy the great song