【问题标题】:selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element:selenium.common.exceptions.NoSuchElementException:消息:无法找到元素:
【发布时间】:2014-11-24 19:35:05
【问题描述】:

我正在尝试使用 selenium 在网页 kahoot.it 上自动生成大量用户,以使他们出现在课程前面,但是,当我尝试访问 inputSession 项目(您在其中编写进入游戏的游戏ID)

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

driver = webdriver.Firefox()
driver.get("http://www.kahoot.it")

gameID = driver.find_element_by_id("inputSession")
username = driver.find_element_by_id("username")

gameID.send_keys("53384")

这是错误:

selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element:
{"method":"id","selector":"inputSession"}

【问题讨论】:

  • html 长什么样子?
  • 您可以从 kahoot.it 查看整个代码,但相关部分是:

标签: selenium webdriver element


【解决方案1】:

看起来加载网页需要时间,因此没有检测到 webelement。您可以使用上面@shri 的代码,也可以在代码driver = webdriver.Firefox() 下方添加这两个语句:

driver.maximize_window() # For maximizing window
driver.implicitly_wait(20) # gives an implicit wait for 20 seconds

【讨论】:

  • @MortenStulen:如果您觉得它有帮助,请点赞。谢谢.. :)
  • 很高兴它帮助了你.. :)
  • 很高兴它帮助了你@Volatil3。 :)
【解决方案2】:

可能是一种竞态条件,其中 find 元素在页面上出现之前正在执行。看看wait timeout documentation。这是文档中的一个示例

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

driver = webdriver.Firefox()
driver.get("http://somedomain/url_that_delays_loading")
try:
    element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "myDynamicElement"))
    )
finally:
    driver.quit()

【讨论】:

【解决方案3】:

您也可以使用以下作为上述两种解决方案的替代方案:

import time
time.sleep(30) 

【讨论】:

  • driver.implicitly_wait(30) 是一个更好的选择,因为这种睡眠总是等待 30'(不仅在需要时)
【解决方案4】:

这对我有用(try/finally 没有,一直点击 finally/browser.close())

from selenium import webdriver

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

driver = webdriver.Firefox()
driver.get('mywebsite.com')

username = None
while(username == None):
    username = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "username"))
    )
username.send_keys('myusername@email.com')

【讨论】:

    【解决方案5】:

    您的浏览器似乎没有读取正确的 HTML 文本/标签,请使用延迟功能来帮助页面先加载,然后从页面中获取所有标签。

    driver = webdriver.Chrome('./chromedriver.exe')
    # load the page
    driver.get('https://www.instagram.com/accounts/login/')
    # use delay function to get all tags
    driver.implicitly_wait(20)
    # access tag
    driver.find_element_by_name('username').send_keys(self.username)
    

    【讨论】:

      【解决方案6】:

      对于某些人来说,这可能是由于单击按钮时打开了新标签(特别是在这个问题中)。然后就可以通过命令切换标签页了。

      driver.switch_to.window(driver.window_handles[1]) #for switching to second tab
      

      【讨论】:

        【解决方案7】:

        在我的例子中,错误是由我正在寻找的元素在 iframe 中引起的。这意味着我必须在查找元素之前更改框架:

        from selenium import webdriver
            
        driver = webdriver.Chrome()
        driver.get("https://www.google.co.uk/maps")
        
        frame_0 = driver.find_element_by_class_name('widget-consent-frame')
        driver.switch_to.frame(frame_0)
        
        agree_btn_0 = driver.find_element_by_id('introAgreeButton')
        agree_btn_0.click()
        

        Reddit source

        【讨论】:

          【解决方案8】:

          这只是表示功能在按钮被点击之前正在执行。示例解决方案:

          from selenium import sleep
          # load the page first and then pause
          sleep(3)
          # pauses executing the next line for 3 seconds
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多