Как загрузить файл из selenium python при вызове ng-click

#javascript #python #angular #selenium #selenium-chromedriver

#javascript #python #angular #selenium #selenium-chromedriver

Вопрос:

Я пытаюсь эмулировать загрузку файла с веб-сайта с использованием Selenium Python при нажатии кнопки, определенной с помощью ng-click .

HTML-файл имеет следующее содержимое:

 <div class="col-lg-6 btn-group">
  <br/>
  <br/>
  <input type="button" ng-click="exportToExcel('#exportable')" class="btn-text btn-link export-main" value="Export" />
</div>
  

Код, который я ввел после проверки разных параметров, ничего не делает.

Я

Когда я использую Selenium IDE, единственный записанный шаг — это «щелкнуть» по элементу «css = btn-text», и это работает, но с драйвером Chrome и Selenium в Python ничего не загружается.

У меня есть этот код, чтобы убедиться, что драйвер Chrome загружает файл. (Я тестировал с другими сайтами, и это работает)

  options = webdriver.ChromeOptions()
          prefs = {'download.default_directory' : self.download_location,
              'download.prompt_for_download': False,
              'download.directory_upgrade': True,
              'safebrowsing.enabled': False,
              'safebrowsing.disable_download_protection': False}
          options.add_argument('--headless')
          options.add_experimental_option('prefs', prefs)
          driver = webdriver.Chrome(chrome_options=options, 
                                   service_args=['--verbose', '--log-path=/tmp    /chromedriver.log'])
  

Вот код, который я использую, чтобы нажать на кнопку, чтобы загрузить файл:

 export_button = WebDriverWait(self.webdriver,10).until(ec.visibility_of_element_located((By.CLASS_NAME, "export-main"))) 

 ActionChains(self.webdriver)
  .click(export_button)
  .move_to_element(export_button)
  .perform()
  

Я ожидал бы загрузить файл Excel в указанную папку в драйвер Chrome, но, похоже, Selenium и Angular плохо сочетаются друг с другом.

Есть ли другой способ вызвать функцию «ExportToExcel» с помощью Javascript?

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

1. Попробуйте это. Посмотрите, поможет ли это export_button = WebDriverWait(self.webdriver,10).until(ec.element_to_be_clickable((By.CSS_SELECTOR, "input.export-main")))

2. Спасибо за ваш ответ. Я пытался, но это не сработало.

3. какую ошибку вы получаете? есть трассировка стека?

4. чтобы просто ответить на ваш вопрос о вызове ExportToExcel с использованием javascript, просто запустите driver.execute_script("exportToExcel('#exportable');") . я не знаю, загрузит ли это ваш файл, но именно так вы выполняете javascript в webdriver.

5. @KunduK Я не получаю никакой трассировки стека. Ошибок нет. Я просто получаю инструкции отладки из драйвера Chrome в /tmp/chromedriver.log, но я не вижу никаких ошибок в журнале (нет трассировки стека в точке вызова. Есть ли какой-нибудь способ для дополнительной отладки webdriver?

Ответ №1:

не имея возможности проверить это самостоятельно, поскольку каждый веб-сайт отличается, вы можете вызвать функцию javascript, о которой вы спрашиваете. Selenium позволяет довольно легко запускать javascript из webdriver. это можно сделать с помощью

 driver.execute_script("exportToExcel('#exportable');")
  

Я не знаю, загрузит ли это ваш файл, но это отвечает на ваш вопрос о том, как вы выполняете javascript в webdriver. опять же, будет ли это загружать файл или нет, зависит от многих других обстоятельств, которые нельзя определить из вашего сообщения, не имея дополнительной информации.

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

1. «exportToExcel» — это угловая функция, и когда я ввожу эту команду, она жалуется, что функция не существует. Ниже приведен журнал из драйвера Chrome: [1554990242.867][INFO]: [60f33b385dd98a5ff18a450760d13d7e] COMMAND ExecuteScript { "args": [ ], "script": "exportToExcel('#exportable')", "sessionId": "60f33b385dd98a5ff18a450760d13d7e" } `1554990242.870][ИНФОРМАЦИЯ]: [60f33b385dd98a5ff18a450760d13d7e] ОШИБКА executeScript ОШИБКА javascript: exportToExcel не определен`

2. Может быть, функции Javascript не загружаются во время вызова? Как я могу гарантировать загрузку полного DOM?

3. @juanv честно говоря, без какого-либо воспроизводимого кода мы действительно не можем помочь. на данный момент все это просто предположения. у вас есть код для создания вашего экземпляра драйвера, определения местоположения кнопки и ожидания кнопки, но мы понятия не имеем, что еще происходит с сайтом, поскольку мы даже не знаем, что это за сайт.

Ответ №2:

Я получил ответ на проблему:

просто вызовите javascript, чтобы нажать на «кнопку экспорта», например:

 self.webdriver.execute_script("arguments[0].click();", export_button)
  

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

1. как? я пытаюсь, но это не работает