Как исправить исключение NoSuchElementException (использование XPath с селеном)

#python #selenium #xpath #metamask

Вопрос:

Я пытаюсь настроить метамаску импорта selenium, однако, когда я использую xpath /html/body/div[1]/div/div[3]/div/div/div/button , моя консоль возвращает «selenium.common.исключения.Исключение NoSuchElementException: Сообщение: такого элемента нет: Не удается найти элемент: {«метод»:»xpath»,»селектор»:»/html/тело/div[1]/div/div[3]/div/div/div/кнопка»} (Информация о сеансе: chrome=93.0.4577.82)»

Что странно, так как, когда я использую $x("/html/body/div[1]/div/div[3]/div/div/div/button") инструменты разработки Chrome, он может идентифицировать кнопку «Начать». Как я могу исправить эту ошибку и почему я получаю указанную ошибку?

Полный Исходный Код:

 from selenium.webdriver.chrome.options import Options
import time

options = Options()
options.add_extension('metamask-chrome-9.8.4.crx')

driver = webdriver.Chrome('./chromedriver', options = options)
driver.get('https://google.com')

time.sleep(2)

get_started_button = driver.find_element_by_xpath("/html/body/div[1]/div/div[3]/div/div/div/button")
get_started_button.click()

input('Press [ENTER] to close browsers...')

driver.quit()```

 

Полный Журнал Ошибок:

   File "D:Riasmetamask seleniumscript.py", line 13, in <module>
    get_started_button = driver.find_element_by_xpath("/html/body/div[1]/div/div[3]/div/div/div/button")
  File "C:UsersUserAppDataLocalProgramsPythonPython39libsite-packagesseleniumwebdriverremotewebdriver.py", line 394, in find_element_by_xpath
    return self.find_element(by=By.XPATH, value=xpath)
  File "C:UsersUserAppDataLocalProgramsPythonPython39libsite-packagesseleniumwebdriverremotewebdriver.py", line 976, in find_element
    return self.execute(Command.FIND_ELEMENT, {
  File "C:UsersUserAppDataLocalProgramsPythonPython39libsite-packagesseleniumwebdriverremotewebdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "C:UsersUserAppDataLocalProgramsPythonPython39libsite-packagesseleniumwebdriverremoteerrorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"/html/body/div[1]/div/div[3]/div/div/div/button"}
  (Session info: chrome=93.0.4577.82)```




 

Комментарии:

1. Пожалуйста, опубликуйте html.

2. Проверьте, является ли элемент iframe или shadow-root .

3. @normon99 : Можно ли поделиться URL — адресом страницы ?

4. Я могу, но вам нужно установить расширение metamask, чтобы получить доступ к URL-адресу. Не могли бы вы связать ссылку с расширением? Я считаю, что он перенаправляет вас на этот URL-адрес, когда вы устанавливаете его в первый раз

5. pastebin.com/PnUJtAuY Кнопка // html, на которую я пытаюсь нажать, это </style></div><div class="main-container-wrapper"><div class="first-time-flow">

Ответ №1:

Есть 4 способа щелкнуть в Selenium.

Я буду использовать этот xpath

 //button[text()='Get Started']
 

Пробная версия кода 1 :

 time.sleep(5)
driver.find_element_by_xpath("//button[text()='Get Started']").click()
 

Пробная версия кода 2 :

 WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//button[text()='Get Started']"))).click()
 

Пробная версия кода 3 :

 time.sleep(5)
button = driver.find_element_by_xpath("//button[text()='Get Started']")
driver.execute_script("arguments[0].click();", button)
 

Испытание кода 4 :

 time.sleep(5)
button = driver.find_element_by_xpath("//button[text()='Get Started']")
ActionChains(driver).move_to_element(button).click().perform()
 

Импорт :

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

PS : Пожалуйста, проверьте инструменты разработки, есть ли у нас уникальный вход HTML DOM или нет.

Шаги для проверки:

Press F12 in Chrome -> перейдите в раздел элементов ->> нажмите CTRL F ->>> затем вставьте xpath и посмотрите, подсвечивается ли нужный элемент.

Ответ №2:

Когда вы загружаете расширение metamask в свой драйвер selenium (chrome), на страницу metamask происходит перенаправление, которое вы можете увидеть в открывшемся окне chrome. но селен не смог найти кнопку, потому что он все еще видит первую вкладку как свою активную вкладку, поэтому он ищет кнопку не в том месте и не на той вкладке.

вы должны изменить активную вкладку в selenium на вкладку «метамаска». смотрите приведенный ниже фрагмент

 from selenium.webdriver.chrome.options import Options
import time

options = Options()
options.add_extension('metamask-chrome-9.8.4.crx')

driver = webdriver.Chrome('./chromedriver', options = options)
driver.get('https://google.com')

time.sleep(2)

driver.switch_to.window(driver.window_handles[0])

get_started_button = driver.find_element_by_class_name("first-time-flow__button")
get_started_button.click()

input('Press [ENTER] to close browsers...')

driver.quit()
 

Я только что добавил эту строку:

 driver.switch_to.window(driver.window_handles[0])
 

чтобы переключиться на страницу расширения и изменить выбор кнопки по XPath на имя класса

со мной это прекрасно работает.