#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. как? я пытаюсь, но это не работает