#python #selenium #xpath
#python #selenium #xpath
Вопрос:
Предыстория:
У меня есть следующий HTML-код, который я пытаюсь получить XPATH для использования с Selenium
<div class="btn-group">
<a type="button" class="btn btn-primary btn-user" onclick="AiD('182030801')" href="/download.pdf?id=182030801amp;amp;h=917901e6659ad5eb53970aecf687b53eamp;amp;u=cacheamp;amp;ext=pdf" target="_blank" style="border-top-left-radius: 3px;border-bottom-left-radius: 3px;">
<i class="fas fa-cloud-download-alt" aria-hidden="true" style="margin-right: 9px;margin-left: 2px;font-size: 25px;vertical-align: middle;color: #119802;"></i>Download ( PDF )
</a>
[...]
</div>
Код:
Что я пытался сделать с Selenium Python, так это следующее, однако я не могу заставить его работать без того, чтобы Python выдавал ошибку:
browser.find_element(By.XPATH, "//div[@class='btn-group']/a").click()
browser.find_element(By.XPATH, "//div[@class='btn tn-primary btn-user']").click()
Ошибка:
Когда я запускаю приведенный выше фрагмент кода, возникает следующая ошибка, и после этого происходит сбой скрипта:
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"//div[@class='btn tn-primary btn-user']"}
Проблема:
Ошибка указывает « no such element
«, однако элемент явно существует « class="btn btn-primary btn-user"
«
Вопрос:
Как я могу использовать Seleniums XPATH, чтобы «увидеть» class="btn btn-primary btn-user"
и щелкнуть по нему, чтобы загрузить PDF?
Ссылка:
PDFDrive
Комментарии:
1. Может быть вероятность, что элемент находится внутри iframe. Если URL является общедоступным, пожалуйста, поделитесь. else разделяют более html-часть элемента
2. добавлена ссылка @Dev
Ответ №1:
Используйте Xpath //div/a[@class='btn btn-primary btn-user']
-
Убедитесь, что предполагаемый элемент не находится под iFrame. Если это так, то сначала вам нужно переключиться на этот iFrame, а затем выполнить действие
-
Убедитесь, что вы используете правильную синхронизацию, и ваш элемент готов. Введите явное ожидание, как показано ниже:
driver.get('https://www.pdfdrive.com/querying-xml-xquery-xpath-and-sqlxml-in-context-d38665640.html') WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//div[@class='btn-group']/a"))).click() time.sleep(10) // it doesn't recommanded to put hardcoded wait but for debugging purpose you can check
Импортируйте для этого следующие пакеты:
from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By from selenium.webdriver.support.wait import WebDriverWait
Комментарии:
1. Ошибок в коде нет, однако загрузка не запускается :/
2. @3kstc, обновил ответ. проверьте с условием ожидания. это работает на моем конце. дайте мне знать, если вы все еще сталкиваетесь с такой же проблемой
3. Да, мой код также работает с моей стороны, так что это может быть что-то другое.
4. @3kstc, загружается PDF. но если вы выполняете какое-то действие сразу после загрузки, оно смещает фокус. Чтобы проверить, загружается файл или нет, попробуйте
time.sleep(10)
сразу после загрузки нажать команду5. Кажется, я не могу заставить это работать — вероятно, лучше, если у вас есть полный скрипт python здесь — чтобы я мог сравнить различия..
Ответ №2:
Вы используете тег «div», но я вижу соответствующий class = btn btn-основной btn-пользователь находится внутри тега «a»
попробуйте следующий код :
browser.find_element(By.XPATH, "//a[@class='btn tn-primary btn-user']").click()
Или вы также можете использовать другой локатор.
CSS : a.btn.btn-primarybtn-user
Ответ №3:
Итак, вам нужно дождаться, пока элемент станет интерактивным. Запуск загрузки.
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
options = Options()
driver = webdriver.Chrome(ChromeDriverManager().install(),options=options)
url = 'https://www.pdfdrive.com/querying-xml-xquery-xpath-and-sqlxml-in-context-d38665640.html'
driver.get(url)
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR,'a.btn.btn-primary.btn-user'))).click()
Комментарии:
1. Все еще не удается загрузить pdf — 🙁
2. Используете ли вы какие-либо опции в Chrome?
3. нет — никакие параметры не вызываются… если вы можете загрузить odf — не могли бы вы поделиться своим полным кодом?
4. Простая настройка.