NoSuchElementException:消息:没有这样的元素:尝试在iframe中找到元素时找不到元素

时间:2019-01-14 11:29:47

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

我正在尝试使用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()

不幸的是,我需要单击的按钮在网页中很深,并且需要特定的插件,这使您难以复制我的程序流程。因此,我上传了网页源代码的图像(蓝线是我想单击的按钮):

enter image description here

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

2 个答案:

答案 0 :(得分:2)

要在所需元素上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的相关讨论

答案 1 :(得分:2)

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

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

然后继续等待并单击。