Selenium Webdriver Скачать CSV

#python #csv #selenium-webdriver #webautomation

#python #csv #selenium-webdriver #вебавтоматизация

Вопрос:

Я пытаюсь использовать Selenium для загрузки CSV-файла в течение нескольких дней. Пожалуйста, посоветуйте, очень признателен!!

Я использую языковые привязки Selenium Webdriver (Python) 2.4 браузер HtmlUnit.

Код:

 browser.find_element_by_id("generate_csv").click()
csv_file = browser.page_source
  

На этой веб-странице, если я использую Firefox, после нажатия кнопки «generate_csv» он сгенерирует CSV-файл и обычно загружает его. Поскольку я использую HtmlUnit, сложно реализовать загрузку файлов, поэтому я использую page_source атрибут для получения содержимого CSV.

Иногда это удается!! Но иногда это выдает ошибку:

 org.openqa.selenium.NoSuchElementException: Returned node was not an HTML element
  

Может ли кто-нибудь помочь мне проанализировать, почему это происходит? Я настолько сбит с толку, что запуск скрипта подобен броску игральных костей.

Спасибо.

Обновление: (часть обратной трассировки)

 14:29:15.913 INFO - Executing: [find element: By.selector: .controlbuttons > a > img[alt='CSV']])
14:29:16.404 WARN - Exception thrown
org.openqa.selenium.NoSuchElementException: Returned node was not an HTML element
For documentation on this error, please visit: ...
Driver info: driver.version: EventFiringWebDriver
    at org.openqa.selenium.htmlunit.HtmlUnitDriver.findElementByCssSelector(HtmlUnitDriver.java:952)
    at org.openqa.selenium.By$ByCssSelector.findElement(By.java:426)
    at org.openqa.selenium.htmlunit.HtmlUnitDriver$5.call(HtmlUnitDriver.java:1565)
    at org.openqa.selenium.htmlunit.HtmlUnitDriver$5.call(HtmlUnitDriver.java:1)
    at org.openqa.selenium.htmlunit.HtmlUnitDriver.implicitlyWaitFor(HtmlUnitDriver.java:1241)
    at org.openqa.selenium.htmlunit.HtmlUnitDriver.findElement(HtmlUnitDriver.java:1562)
    at org.openqa.selenium.htmlunit.HtmlUnitDriver.findElement(HtmlUnitDriver.java:530)
    at sun.reflect.GeneratedMethodAccessor129.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.openqa.selenium.support.events.EventFiringWebDriver$2.invoke(EventFiringWebDriver.java:101)
    at com.sun.proxy.$Proxy14.findElement(Unknown Source)
    at org.openqa.selenium.support.events.EventFiringWebDriver.findElement(EventFiringWebDriver.java:184)
    at org.openqa.selenium.remote.server.handler.FindElement.call(FindElement.java:47)
    at org.openqa.selenium.remote.server.handler.FindElement.call(FindElement.java:1)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
    at java.util.concurrent.FutureTask.run(FutureTask.java:138)
    at org.openqa.selenium.remote.server.DefaultSession$1.run(DefaultSession.java:169)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
    at java.lang.Thread.run(Thread.java:695)
14:29:16.405 WARN - Exception: Returned node was not an HTML element
  

Комментарии:

1. Не могли бы вы показать полную обратную трассировку? Спасибо.

2. вы пробовали использовать explicit wait

3. @alecxe Спасибо! Я просто добавляю часть обратной связи в свой вопрос.

Ответ №1:

Похоже, ваш html не завершит загрузку до того, как вы нажмете на кнопку сгенерировать csv. Это часто происходит с selenium при загрузке html из javascript — по крайней мере, для меня.

Не уверен, что это лучший способ справиться с этим, но я бы использовал рекурсивный метод, чтобы нажимать, пока вы не получите его…

 import time
def generateCsv(browser):
    try:
        browser.find_element_by_id("generate_csv").click()
        csv_file = browser.page_source
    Except NoSuchElementException,e:
        time.sleep(3)
        generateCsv(browser)
  

Надеюсь, это поможет

Комментарии:

1. 1 для «HTML не завершает загрузку.. с Selenium происходит куча проблем»

2. Спасибо за ответ! Поскольку все данные находятся на веб-странице, я в конечном итоге загружаю все содержимое html-файла и анализирую его в CSV-файл.