#python #selenium #selenium-webdriver
#python #селен #selenium-webdriver
Вопрос:
В настоящее время я использую BeautifulSoup в своем проекте веб-очистки python. Однако на одной из страниц, которые мне нужно очистить, мне нужно взаимодействовать с элементом javascript. Итак, я вынужден использовать selenium (с которым я не очень знаком). Пока это мой код:
from selenium.webdriver import Firefox
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
opts = Options()
opts.add_argument('--headless')
seleniumDriver = Firefox(options=opts, executable_path = 'D:ProgramsPythonScriptsgeckodriver.exe')
seleniumDriver.get("https://www.thecompleteuniversityguide.co.uk/courses/details/computing-bsc/57997898")
driverWait = WebDriverWait(seleniumDriver, 10)
driverWait.until(EC.invisibility_of_element_located((By.ID, "mainBody")))
moduleButton = seleniumDriver.find_element_by_xpath("//div[@class='mdldv']")#.find_element_by_tag_name("span")
print("MODULE BUTTON:", moduleButton)
moduleButton.click()
seleniumDriver.close()
В настоящее время я получаю ошибку тайм-аута, однако я уверен, что элемент mainBody ID действительно существует.
(Я не знаю, как использовать класс By, поэтому я понятия не имею, как это будет работать).
Сообщение об ошибке:
Traceback (most recent call last):
File "D:/Web Scraping/selenium tests.py", line 12, in <module>
driverWait.until(EC.invisibility_of_element_located((By.ID, "mainBody")))
File "D:ProgramsPythonlibsite-packagesseleniumwebdriversupportwait.py", line 80, in until
raise TimeoutException(message, screen, stacktrace)
selenium.common.exceptions.TimeoutException: Message:
Ответ №1:
Вы вызываете:
driverWait.until(EC.invisibility_of_element_located((By.ID, "mainBody")))
Согласно документу, это будет ждать, пока элемент не исчезнет:
class invisibility_of_element_located(object):
""" An Expectation for checking that an element is either invisible or not
present on the DOM.
locator used to find the element
"""
Возникшее исключение тайм-аута означает, что элемент был найден, но никогда не удалялся из DOM или никогда не становился невидимым.
Что вам нужно, чтобы он подождал, пока элемент не будет найден (часть DOM). Используйте вместо, presence_of_element_located
driverWait.until(presence_of_element_located((By.ID, "mainBody")))
timeout
Исключение будет вызвано, если оно не найдено в течение времени ожидания, запрошенного при создании driverWait
(Я не знаю, как использовать класс By, поэтому я понятия не имею, как это будет работать)
By
Используется под капотом при вызове find_element_by_xpath/id/css_selector .
В вашем случае, когда вы используете EC, вы предоставляете локатор для использования By.Идентификатор и его значение. Вы можете видеть, что оно равно find_element_by_id('yourValue')
Комментарии:
1. Я получаю сообщение об ошибке, что элемент не может быть прокручен в поле зрения, я думал, что ожидание его загрузки решит эту проблему?
Traceback (most recent call last): File "D:Web Scrapingselenium tests.py", line 16, in <module> moduleButton.click() ... selenium.common.exceptions.ElementNotInteractableException: Message: Element <div class="mdldv"> could not be scrolled into view
2. Пришлось включить режим без головы, чтобы точно увидеть, что происходит … оказывается, мне пришлось нажать другую кнопку, прежде чем я смогу продолжить поиск