Невозможно нажать на ссылку для скачивания с js backend - PullRequest
1 голос
/ 10 ноября 2019

На сайте есть ссылка, которая скачивает 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()

Как получить файл для загрузки?

Ответы [ 2 ]

1 голос
/ 11 ноября 2019

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

driver.find_element_by_link_text('ford.csv')

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


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

  • Разделить текст ford.csv на две части ford и csv и использовать в
  • Поскольку вы намереваетесь вызвать 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
      
0 голосов
/ 11 ноября 2019

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

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

item = driver.find_element_by_link_text('ford.csv')
ActionChains(driver).move_to_element(item).click().perform()
...