如何修复NoSuchElementException(使用XPath表达式和Selenium)

uoifb46i  于 2022-11-24  发布在  其他
关注(0)|答案(2)|浏览(158)

我尝试让Selenium导入元掩码。但是,当我使用XPath表达式/html/body/div[1]/div/div[3]/div/div/div/button时,控制台返回:
selenium.common.exceptions.NoSuchElementException:消息:没有此元素:找不到元素:{“方法”:“xpath”,“选择器”:“/html/body/div 1/div/div[3]/div/div/div/按钮”}(会话信息:铬=93.0.4577.82)
奇怪的是,当我在Chrome DevTools中使用$x("/html/body/div[1]/div/div[3]/div/div/div/button")时,它能够识别"开始“按钮。我如何修复此错误,为什么会出现上述错误?
完整的源代码:

from selenium import webdriver
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()

完整错误日志:

Traceback (most recent call last):
  File "D:\Rias\metamask selenium\script.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:\Users\User\AppData\Local\Programs\Python\Python39\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 394, in find_element_by_xpath
    return self.find_element(by=By.XPATH, value=xpath)
  File "C:\Users\User\AppData\Local\Programs\Python\Python39\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 976, in find_element
    return self.execute(Command.FIND_ELEMENT, {
  File "C:\Users\User\AppData\Local\Programs\Python\Python39\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "C:\Users\User\AppData\Local\Programs\Python\Python39\lib\site-packages\selenium\webdriver\remote\errorhandler.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)
ebdffaop

ebdffaop1#

在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中的唯一条目。
检查步骤:

在Chrome中按下F12 →转到元素部分→执行Ctrl + F →然后粘贴XPath表达式并查看,如果您想要的元素被突出显示。

hjzp0vay

hjzp0vay2#

当您将元掩码扩展加载到Selenium驱动程序(Chrome)时,会出现一个重定向到元掩码页面的情况,您可以通过打开的Chrome窗口看到该页面。
但是Selenium找不到按钮,因为它仍然将第一个选项卡视为活动选项卡,所以它在错误的位置和错误的选项卡中查找按钮。
您必须将Selenium中的active标签更改为metamask标签。请参见以下代码片段:

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选择按钮更改为通过 class_name
我觉得很好。

相关问题