Selenium не может найти элемент id в <div> - PullRequest
0 голосов
/ 31 января 2020

Я пытаюсь получить текст HTML с веб-страницы, используя python селен. Но Селен, кажется, не может найти элемент. Не уверен, что делаю что-то не так и ищу ответы здесь.

Пожалуйста, посмотрите часть моего кода ниже:

wait(driver, 10).until(EC.visibility_of_element_located((By.ID, 'current_address_name')))
full_address = driver.find_element_by_id('current_adress_name')
street_address = full_address.text.split('(S)')[0]
print('Street Address: ' + str(street_address))
all_street_address.append(street_address)

Это сообщение об ошибке (тайм-аут). Предположительно, потому что он не может найти элемент:

Exception in thread Thread-1:
Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/threading.py", line 932, in _bootstrap_inner
    self.run()
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/threading.py", line 870, in run
    self._target(*self._args, **self._kwargs)
  File "/Volumes/GoogleDrive/My Drive/PycharmProjects/googlestuff/gsheet_test_mod.py", line 121, in web_extraction
    wait(driver, 10).until(EC.visibility_of_element_located((By.ID, 'current_address_name')))
  File "/Users/cadellteng/googstuff/lib/python3.8/site-packages/selenium/webdriver/support/wait.py", line 80, in until
    raise TimeoutException(message, screen, stacktrace)
selenium.common.exceptions.TimeoutException: Message:

И это часть кода HTML:

<div id="current_address_name" style="display:none">4 Third Avenue (S)266576</div>

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

На всякий случай, если вам нужен полный код, это страница: Singapore Streetdirectory

1 Ответ

1 голос
/ 31 января 2020

Метод visibility_of_element_located предназначен для "проверки наличия элемента в DOM страницы и его видимости." .

Ясно, что этот элемент не виден, так как элемент имеет style="display:none" set.

Вместо этого вы можете использовать presence_of_element_located, который просто проверит наличие элемента в дереве DOM:

wait(driver, 10).until(EC.presence_of_element_located((By.ID, 'current_address_name')))

Исправление некоторых других проблем с вашим код, полный минимальный воспроизводимый пример:

from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium import webdriver

all_street_address = []

driver = webdriver.Chrome()
wait = WebDriverWait

driver.get("https://www.streetdirectory.com/sg/4-third-avenue-266576/1_27869.html")

wait(driver, 10).until(EC.presence_of_element_located((By.ID, 'current_address_name')))
full_address = driver.find_element_by_id('current_address_name')
street_address = full_address.get_attribute('innerHTML').split('(S)')[0]
print('Street Address: ' + str(street_address))
all_street_address.append(street_address)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...