selenium.common.exceptions.NoSuchElementException:消息:无法找到元素:

时间:2014-11-24 19:35:06

标签: selenium webdriver element

我正在尝试使用selenium在网页kahoot.it上自动生成大量用户,使它们出现在类的前面,但是,在尝试访问inputSession项时(我在哪里写),我收到此错误消息gameID进入游戏)

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"}

任何帮助将不胜感激! :)

8 个答案:

答案 0 :(得分:19)

可能是一个竞争条件,其中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()

答案 1 :(得分:17)

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

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

答案 2 :(得分:1)

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

import time
time.sleep(30) 

答案 3 :(得分:0)

这仅表示该功能正在执行,然后才能单击按钮。解决方案示例:

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

答案 4 :(得分:0)

这对我有用(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 :(得分:0)

您的浏览器似乎没有读取正确的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 :(得分:0)

对于某些人来说,也可能是由于单击按钮时打开了新选项卡(特别是不在此问题中)。然后您可以通过命令切换选项卡。

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

答案 7 :(得分:0)

就我而言,错误是由我在 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()

来源:https://www.reddit.com/r/selenium/comments/7yoxrc/hi_why_do_i_get_this_error_selenium_python/