How do you use EC.presence_of_element_located((By.ID, "myDynamicElement")) except to specify class not ID
Как вы используете EC.presence_of_element_located((By.ID, "myDynamicElement")), кроме как указывать класс без идентификатора
Я пытаюсь использовать Python для веб-очистки веб-сайта, который динамически загружает свой HTML-код с помощью встроенных файлов javascript, которые отображают данные в виде ответа в HTML. Следовательно, если я использую только BeautifulSoup, я не смогу получить те данные, которые мне нужны, поскольку моя программа очистит их до того, как Javascript загрузит данные. В связи с этим я интегрирую библиотеку selenium в свой код, чтобы заставить мою программу ждать, пока определенный элемент не будет найден, прежде чем она очистит веб-сайт.
Я изначально сделал это:
element = WebDriverWait(driver,100).until(EC.presence_of_element_located((By.ID, "tabla_evolucion")))
Но вместо этого я хочу указать класс, выполнив что-то вроде:
element = WebDriverWait(driver,100).until(EC.presence_of_element_located((By.class, "ng-binding ng-scope")))
Вот остальная часть моего кода:
driver_path = 'C:/webDrivers/chromedriver.exe' driver = webdriver.Chrome(executable_path=driver_path) driver.header_overrides = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36'} url = "myurlthatIamscraping.com" response = driver.get(url) html = driver.page_source characters = len(html) element = WebDriverWait(driver,100).until(EC.presence_of_element_located((By.class, "ng-binding ng-scope")))
Вам нужно позаботиться о нескольких вещах следующим образом:
Без какой-либо видимости для вашей базы данных, функционально вызывая WebDriverWait в сочетании с EC as presence_of_element_located() просто подтверждает присутствие элемента в дереве DOM. Предположительно, в дальнейшем вам нужно либо получить атрибуты, например, value, innerText и т.д., Либо вы будете взаимодействовать с элементом. Итак, вместо presence_of_element_located() вам нужно использовать либо visibility_of_element_located(), либо element_to_be_clickable()
Для достижения оптимального результата вы можете объединить атрибуты ID и CLASS и использовать любую из следующих стратегий поиска:
Использование CSS_SELECTOR:
element = WebDriverWait(driver, 20).until(EC.visibility_of_element_located( (By.CSS_SELECTOR, ".ng-binding.ng-scope#tabla_evolucion")))
Использование XPATH:
element = WebDriverWait(driver, 20).until(EC.visibility_of_element_located( (By.XPATH, "//*[@class='ng-binding ng-scope' and @id='tabla_evolucion']")))
Набор поддерживаемых стратегий локализации. ИМЯ_КЛАССА = 'имя класса' CSS_SELECTOR = 'css-селектор' ID = 'id' LINK_TEXT = 'текст ссылки' NAME = 'имя' PARTIAL_LINK_TEXT = 'частичный текст ссылки' ИМЯ_ТЕГА = 'имя тега' XPATH = 'xpath'
Примечание: То, что у вас есть в вашем коде, - это не класс, это два класса. Это не сработает, если вы используете By.CLASS_NAME() потому что он ожидает только один класс. Вместо этого вам нужен CSS-селектор.