【问题标题】:How to fix NoSuchElementException (Using XPaths with Selenium)如何修复 NoSuchElementException(将 XPath 与 Selenium 一起使用)
【发布时间】:2021-09-18 23:09:37
【问题描述】:

我正在尝试使用 selenium 导入元掩码,但是当我使用 xpath /html/body/div[1]/div/div[3]/div/div/div/button 时,我的控制台返回“selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath ","选择器":"/html/body/div[1]/div/div[3]/div/div/div/button"} (会话信息: chrome=93.0.4577.82)"

奇怪的是,当我在 chrome 开发工具中使用 $x("/html/body/div[1]/div/div[3]/div/div/div/button") 时,它能够识别“开始”按钮。我该如何解决这个错误?为什么会出现这个错误?

完整源代码:

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:\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)```




【问题讨论】:

  • 请张贴html。
  • 检查元素是iframe还是shadow-root
  • @normon99 : 是否可以分享页面网址?
  • 我可以,但您需要安装元掩码扩展才能访问该 URL。您会将链接链接到扩展程序吗?我相信它会在您第一次安装时将您重定向到该网址
  • pastebin.com/PnUJtAuY 我试图点击的按钮 // html 是&lt;/style&gt;&lt;/div&gt;&lt;div class="main-container-wrapper"&gt;&lt;div class="first-time-flow"&gt;

标签: python selenium xpath metamask


【解决方案1】:

在 Selenium 中有 4 种点击方式。

我将使用这个 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 找不到该按钮,因为它仍然将第一个选项卡视为其活动选项卡,因此它会在错误的位置和错误的选项卡中查找按钮。

    您必须将 selenium 中的活动选项卡更改为元掩码选项卡。见下sn-p

    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

    对我来说很好用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-27
      • 2019-08-25
      • 2011-09-06
      • 2015-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多