Selenium NoSuchElementException-无法找到元素:{“ method”:“ css选择器”,“ selector”:“ [name =” emailAddress“]”}

时间:2019-07-16 23:07:15

标签: python css selenium automated-tests selenium-chromedriver

我正在尝试自动执行登录过程。我正在寻找一个具有名称的元素,但测试失败,并且响应为“ selenium.common.exceptions.NoSuchElementException:消息:没有这样的元素:无法找到元素:{“方法”:“ css选择器”,“选择器” :“ [name =” emailAddress“]”}“ 我的代码有什么问题?

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

class MainTests(unittest.TestCase):
   def setUp(self):
       self.driver = webdriver.Chrome(executable_path=r"C:\TestFiles\chromedriver.exe")

   def test_demo_login(self):
       driver = self.driver
       driver.get('http://localhost:8000/login')
       title = driver.title
       print(title)
       assert 'Calculator' == title


       element = driver.find_element_by_name("emailAddress")
       element.send_keys("name123@gmail.com")

       time.sleep(30)

1 个答案:

答案 0 :(得分:0)

在这些常见情况下,您将得到 NoSuchElementException

  1. 定位器可能是错误的
  2. iframe中可能有元素
  3. 元素可能在另一个窗口中
  4. 时间脚本尝试查找元素时可能未加载元素

现在,让我们看看如何处理这些情况。

1。定位器可能有误

browser devtool/console中检查您的定位器是否正确。

如果您的脚本中的定位器不正确,请更新定位器。如果正确,请转到下面的下一步。

2。元素可能在iframe中存在

检查元素是否存在于iframe中,而不是在父文档中。 enter image description here

如果看到元素在iframe中,则应先切换到iframe,然后再查找元素并与之交互。 (记住,完成iframe元素上的步骤后,请切换回父文档)

driver.switch_to.frame("frame_id or frame_name")

您检查here以获得更多信息。

3。元素可能在另一个窗口中

检查元素是否存在于新的选项卡/窗口中。如果是这种情况,则必须使用switch_to.window切换到标签页/窗口。

# switch to the latest window
driver.switch_to.window(driver.window_handles[-1])

# perform the operations
# switch back to parent window
driver.switch_to.window(driver.window_handles[0])

4。时间脚本尝试查找元素时可能未加载该元素

这是最常见的原因,如果以上都不是错误的根源,我们就会看到NoSuchElementException。您可以使用WebDriverWait进行显式等待,如下所示。

您需要以下导入内容才能进行明确的等待。

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

脚本:

# lets say the "//input[@name='q']" is the xpath of the element
element = WebDriverWait(driver,30).until(EC.presence_of_element_located((By.XPATH,"//input[@name='q']")))
# now script will wait unit the element is present max of 30 sec
# you can perform the operation either using the element returned in above step or normal find_element strategy
element.send_keys("I am on the page now")

您还可以使用隐式等待,如下所示。

driver.implicitly_wait(30)