【问题标题】:NoSuchElementException: Message: no such element: Unable to locate element when trying to find element within a iframeNoSuchElementException:消息:没有这样的元素:尝试在 iframe 中查找元素时无法找到元素
【发布时间】:2019-06-08 09:22:28
【问题描述】:

我正在尝试使用 Selenium 在 Python 中自动执行 Google Chrome 会话。到目前为止,我一直在使用扩展来获取 xpath,它工作正常。但是现在,我在使用我找到的 xpath 时遇到了错误:

NoSuchElementException: 消息:没有这样的元素:无法找到元素:{"method":"xpath","selector":"//*[@id="ok"]"} (会话信息:chrome=71.0.3578.98) (驱动信息:chromedriver=2.45.615291 (ec3682e3c9061c10f26ea9e5cdcf3c53f3f74387),platform=Windows NT 6.3.9600 x86_64)

返回错误的行如下所示:

browser.find_element_by_xpath('//*[@id="ok"]').click()

不幸的是,我需要单击的按钮位于网页的深处,并且需要某个插件,这使您很难复制我的程序流程。因此,我上传了网页源代码的图片(蓝线是我要点击的按钮):

您能否提供一些有关如何更正 selenium 选择器的帮助,以便我能够单击该元素?

【问题讨论】:

    标签: python-3.x selenium xpath css-selectors webdriverwait


    【解决方案1】:

    到所需元素上的click(),因为所需元素在<iframe> 内,因此您必须:

    • 诱导 WebDriverWait 使所需的框架可用并切换到它
    • 诱导 WebDriverWait 使所需的元素可点击
    • 您可以使用以下解决方案:

      • 代码块(使用 CSS_SELECTOR):

        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
        
        WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,"iframe#codefile_iframe")))
        WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input#ok[value='OK'][onclick^='loginui']"))).click()
        
      • 代码块(使用 XPATH):

        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
        
        WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//iframe[@id='codefile_iframe']")))
        WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[@id='ok' and @value='OK'][starts-with(@onclick,'loginui')]"))).click()
        

    在这里你可以找到Ways to deal with #document under iframe的相关讨论

    【讨论】:

      【解决方案2】:

      在与其中的元素交互之前,您需要切换到 iframe:

      iframe = driver.find_element_by_id("codefile_iframe")    
      driver.switch_to.frame(iframe)
      

      然后继续等待并点击。

      【讨论】:

        猜你喜欢
        • 2017-09-15
        • 1970-01-01
        • 1970-01-01
        • 2019-04-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多