Невозможно щелкнуть ссылку для загрузки с бэкэндом js

На веб-сайте есть ссылка для загрузки файла csv. Ссылка находится в таблице, но фактическая ссылка для скачивания скрыта.

<div id="testjs">
    <div test-example="">
        <table test-example="">
            <tr test-example="">
                <th test-example="">Car</th>
                <th test-example="">File</th>
            </tr>
            <tr test-example="">
                <td test-example="">Ford</td>
                <td test-example="">
                    <a test-example="" href="#">ford.csv</a>
                </td>
            </tr>
        </table>
    </div>
</div>

Я пытаюсь автоматизировать загрузку файлов, очищая сайт с помощью python/selenium.

from selenium import webdriver
driver = webdriver.PhantomJS()
driver.get("https://www.example.com")
driver.find_element_by_link_text('ford.csv')

Когда последняя строка выше запускается, скрипт возвращает:

<selenium.webdriver.remote.webelement.WebElement (session="<example session string>", element="<example element string>")>

Когда я запускаю код ниже, ничего не происходит:

driver.find_element_by_link_text('ford.csv').click()

Как получить файл для скачивания?


person chris    schedule 10.11.2019    source источник
comment
Используйте браузер Chrome Headless вместо PhantomJS   -  person KunduK    schedule 10.11.2019
comment
У вас есть решение вашей проблемы с использованием Chrome?   -  person KunduK    schedule 13.11.2019
comment
Я частично смог решить свою проблему с помощью драйвера Chrome, но не без головы. Решение DebanjanB действительно сработало. Однако появилось всплывающее окно «разрешить файлы cookie», которое мешало ссылке для загрузки, которую мне нужно было нажать в первую очередь. Проблема с беззаголовочным хромом заключалась в том, что ничего не загружалось. Когда хром не был безголовым, файл загружался.   -  person chris    schedule 13.11.2019
comment
Проверьте этот ответ для безголового хрома, посмотрите, поможет ли это ="выбрать раскрывающийся список, используя селен безголовый хромированный питон"> stackoverflow.com/questions/58770745/   -  person KunduK    schedule 14.11.2019


Ответы (2)


По-видимому, нет никаких проблем со следующей строкой кода:

driver.find_element_by_link_text('ford.csv')

Однако на данный момент стоит упомянуть, что точка символ . всегда имеет особый эффект/значение.


Предполагая, что вы собираетесь выполнить click() элемент с текстом ford.csv, который находится рядом с элементом с текстом Ford, в качестве решения вы можете:

  • Разделите текст ford.csv на две части ford и csv и используйте в xpath
  • Поскольку вы намереваетесь вызвать click(), вы должны вызвать WebDriverWait для element_to_be_clickable()
  • Вы можете использовать любую из следующих стратегий поиска:

    • Использование CSS_SELECTOR:

      WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "tr[test-example] td:nth-child(2)>a[test-example]"))).click()
      
    • Использование XPATH:

      WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//a[contains(., 'ford') and contains(.,'csv')]"))).click()
      
    • Примечание. Вы должны добавить следующие импорты:

      from selenium.webdriver.support.ui import WebDriverWait
      from selenium.webdriver.common.by import By
      from selenium.webdriver.support import expected_conditions as EC
      
person DebanjanB    schedule 11.11.2019
comment
С этими подходами я получаю ту же ошибку: selenium.common.exceptions.ElementClickInterceptedException: Сообщение: щелчок по элементу перехвачен: Элемент ‹a test-example= href=#›...‹/a› не доступен для щелчка в точке (X, Y ). Другой элемент получит щелчок: - person chris; 11.11.2019
comment
Спасибо, проблема заключалась в всплывающем окне «разрешить куки», которое мешало. Поэтому я использовал ваше решение, чтобы сначала разрешить файлы cookie, а затем загрузить файл. - person chris; 13.11.2019

PhantomJS не поддерживается в новой версии Selenium, рассмотрите возможность использования другого драйвера. Для вашей проблемы возникла ошибка при нажатии кнопки с JS.

Попробуйте это, я нашел в своей библиотеке селена кнопки click_js

item = driver.find_element_by_link_text('ford.csv')
ActionChains(driver).move_to_element(item).click().perform()
person Wonka    schedule 11.11.2019
comment
Хорошо, я пытался использовать этот подход с хромом без заголовков, но ничего не происходит. Есть идеи? - person chris; 11.11.2019