0

I am trying to automate downloading mp3 files from Youtube using this site.

Objective:

  • Visit download website
  • Paste Youtube link
  • Click "Convert Video"
  • Wait for download link to appear, then click it

When I use browser.find_by_id('dl_link').click(), my code executes without any errors but the file is not downloaded. Why?

When I use browser.click_link_by_partial_text('Download'), I get the error shown below.

Here is my code:

from splinter.browser import Browser
import time

with Browser() as browser:
   browser.visit("http://www.youtube-mp3.org")
   browser.find_by_id('youtube-url').fill("https://www.youtube.com/watch?v=lgT1AidzRWM")
   browser.find_by_id('submit').click()

   if browser.is_element_present_by_id('dl_link'):
      time.sleep(2)
      browser.click_link_by_partial_text('Download')
      # browser.find_by_id('dl_link').click()
      print "Clicked Download"
      time.sleep(2)

Here is the error I am getting:

Traceback (most recent call last):
  File "/Users/anon/Dropbox/Programs/Proj/splinter2.py", line 11, in <module>
    browser.click_link_by_partial_text('Download')
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/splinter/driver/__init__.py", line 332, in click_link_by_partial_text
    return self.find_link_by_partial_text(partial_text).first.click()
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/splinter/driver/webdriver/__init__.py", line 539, in click
    self._element.click()
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/selenium/webdriver/remote/webelement.py", line 74, in click
    self._execute(Command.CLICK_ELEMENT)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/selenium/webdriver/remote/webelement.py", line 457, in _execute
    return self._parent.execute(command, params)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/selenium/webdriver/remote/webdriver.py", line 233, in execute
    self.error_handler.check_response(response)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/selenium/webdriver/remote/errorhandler.py", line 194, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.ElementNotVisibleException: Message: Element is not currently visible and so may not be interacted with
Stacktrace:
    at fxdriver.preconditions.visible (file:///var/folders/wj/t56fgsms4rdcgptcy94k2w8m0000gn/T/tmpAVUrd2/extensions/fxdriver@googlecode.com/components/command-processor.js:10092)
    at DelayedCommand.prototype.checkPreconditions_ (file:///var/folders/wj/t56fgsms4rdcgptcy94k2w8m0000gn/T/tmpAVUrd2/extensions/fxdriver@googlecode.com/components/command-processor.js:12644)
    at DelayedCommand.prototype.executeInternal_/h (file:///var/folders/wj/t56fgsms4rdcgptcy94k2w8m0000gn/T/tmpAVUrd2/extensions/fxdriver@googlecode.com/components/command-processor.js:12661)
    at DelayedCommand.prototype.executeInternal_ (file:///var/folders/wj/t56fgsms4rdcgptcy94k2w8m0000gn/T/tmpAVUrd2/extensions/fxdriver@googlecode.com/components/command-processor.js:12666)
    at DelayedCommand.prototype.execute/< (file:///var/folders/wj/t56fgsms4rdcgptcy94k2w8m0000gn/T/tmpAVUrd2/extensions/fxdriver@googlecode.com/components/command-processor.js:12608)
[Finished in 7.2s with exit code 1]
[shell_cmd: python -u "/Users/anon/Dropbox/Programs/Proj/splinter2.py"]
[dir: /Users/anon/Dropbox/Programs/Proj]
[path: /usr/bin:/bin:/usr/sbin:/sbin]

I have already checked other questions with the same (Error: “Element is not currently visible and so may not be interacted with” with selenuim) title, but I am still not able to resolve this since the Download button is visible in my case.

Any help would be much appreciated

EDIT:

Whenever I try to set a profile using browser = Browser('firefox', profile=profile), I get the following error:

Traceback (most recent call last):
  File "/Users/adb/Dropbox/Programs/Proj/Youtube Playlist MP3/splinter2.py", line 11, in <module>
    browser = Browser('firefox', profile=profile)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/splinter/browser.py", line 63, in Browser
    return driver(*args, **kwargs)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/splinter/driver/webdriver/firefox.py", line 23, in __init__
    firefox_profile = FirefoxProfile(profile)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/selenium/webdriver/firefox/firefox_profile.py", line 77, in __init__
    ignore=shutil.ignore_patterns("parent.lock", "lock", ".parentlock"))
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py", line 171, in copytree
    names = os.listdir(src)
TypeError: coercing to Unicode: need string or buffer, FirefoxProfile found
adb16x
  • 658
  • 6
  • 24
  • 2
    I think you are missing the browser download folder. That is done be setting a browser profile https://github.com/cobrateam/splinter/blob/master/splinter/driver/webdriver/firefox.py#L25 – Gil Sousa Apr 08 '16 at 09:31
  • http://stackoverflow.com/questions/18439851/downloading-file-using-selenium –  Apr 08 '16 at 09:34
  • @sousatg I have tried setting a browser profile but I keep getting the error shown in the edit – adb16x Apr 08 '16 at 11:25

1 Answers1

0
  1. When I use browser.find_by_id('dl_link').click(), my code executes without any errors but browser.click_link_by_partial_text('Download') throws?

Because you interact with a "static" element.

When you hit the "convert video" button, you refresh the DOM. But your driver still works on the old DOM. That's why you don't find by using browser.click_link_by_partial_text('Download')

  1. When it wokrs, the file is not downloaded. Why?

Probably because there's a pop up windows asking you if you want to save and execute it. Check this out

Community
  • 1
  • 1
e1che
  • 1,241
  • 1
  • 17
  • 34