Selenium NoSuchElementException с допустимым XPath (Python) - PullRequest
1 голос
/ 16 июня 2020

Когда я запускаю приведенный ниже код, я получаю selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"//*[@id="i0"]/input"} (Session info: chrome=83.0.4103.97).

Однако в моем терминале я могу получить доступ к необходимому элементу:

>>> steam_pressure_field = browser.find_element_by_xpath('//*[@id="i0"]/input')
>>> steam_pressure_field.get_attribute('value')
'0'

Как вы можете видеть в комментарии В разделе кода я попытался подождать задержки в 3 секунды, чтобы увидеть, изменилось ли это. Однако, сделав это несколько раз, страница перестала загружаться, когда я использовал задержку (может быть, какая-то функция защиты от ботов?)

Итак, я пытаюсь понять, что здесь происходит, и как я могу успешно получить доступ к нужным мне полям. Есть что-то, что мне не хватает, пожалуйста?

Кстати, идентификаторы div не кажутся динамическими c.

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


user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36'
options = webdriver.ChromeOptions()
options.add_argument(f'user-agent={user_agent}')
browser = webdriver.Chrome(options=options)

url = 'https://www.tlv.com/global/US/calculator/superheated-steam-table.html?advanced=off'

# delay = 3
# try:
    # wait = WebDriverWait(browser, delay)
    # wait.until(EC.presence_of_element_located((By.ID, "body")))
    # browser.get(url)
    # print("Page is ready")
# except TimeoutException:
    # print("Loading took too much time")

browser.get(url)
steam_pressure_field = browser.find_element_by_xpath('//*[@id="i0"]/input')
print(steam_pressure_field.get_attribute('value'))

1 Ответ

0 голосов
/ 18 июня 2020

Чтобы напечатать значение 0 , вы должны вызвать WebDriverWait для visibility_of_element_located(), и вы можете использовать любую из следующих стратегий локатора :

  • Использование CSS_SELECTOR:

    driver.get('https://www.tlv.com/global/US/calculator/superheated-steam-table.html?advanced=off')
    print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "div.inputPanel>div.Controlpanel input.inputText"))).get_attribute("value"))
    
  • Использование XPATH:

    driver.get('https://www.tlv.com/global/US/calculator/superheated-steam-table.html?advanced=off')
    print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//div[@class='InputControlLabel' and text()='Steam Pressure']//following-sibling::input[1]"))).get_attribute("value"))
    
  • Консоль Вывод:

    0
    
  • Примечание : вам необходимо добавить следующие импорты:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...