【问题标题】:selenium in python : NoSuchElementException: Message: no such element: Unable to locate elementpython中的硒:NoSuchElementException:消息:没有这样的元素:无法找到元素
【发布时间】:2019-04-25 18:27:44
【问题描述】:

我尝试在第一个 id 块中输入“abc”,在第二个密码块中输入“cdef”。 但是,底部的错误代码出现了。

from selenium import webdriver
driver.get('http://sugang.korea.ac.kr')

添加了隐式等待以防止代码在页面完全加载之前执行。

driver.implicitly_wait(30)

添加用户名和密码的代码如下

driver.find_element_by_name('id').send_keys('abc') driver.find_element_by_name('pw').send_keys('cdef')

但是遇到错误

NoSuchElementException:消息:没有这样的元素:无法找到元素:{"method":"id","selector":"id"}

请。帮帮我^^

【问题讨论】:

  • 当然,我把驱动和driver.get代码放了。

标签: python selenium selenium-webdriver frame webdriverwait


【解决方案1】:

当网络驱动程序看不到您尝试对其执行操作的元素时,通常会出现无此类元素异常。 原因可能是:

  1. 您的 ID 或名称或 Xpath 或 CssSelector 可能有误。

  2. 您的元素可能位于 iframe 中,因此 Web 驱动程序无法看到或检测到它。 Switch to an iframe through Selenium and python

  3. 您的元素需要一些时间才能出现在 UI 上,因此您可以使用显式等待来解决 这。 https://selenium-python.readthedocs.io/waits.html

【讨论】:

    【解决方案2】:

    用户名密码字段在frame中,所以你必须:

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

      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
      
      driver = webdriver.Firefox(executable_path=r'C:\\Utility\\BrowserDrivers\\geckodriver.exe')
      driver.get("http://sugang.korea.ac.kr")
      WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.NAME,"firstF")))
      WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input.input_login[name='id']"))).send_keys('abc')
      driver.find_element_by_css_selector("input.input_login[name='pw']").send_keys("cdef")
      
    • 浏览器快照:

    【讨论】:

      【解决方案3】:

      显式添加等待

      from selenium.webdriver.support import expected_conditions as EC
      
      userNameElement= WebDriverWait(driver, 2).until(
      EC.presence_of_element_located((By.NAME, "id"))
      userNameElement.send_keys('abc')
      
      pwdElement= WebDriverWait(driver, 2).until(
      EC.presence_of_element_located((By.NAME, "pwd"))
      pwdElement.send_keys('cdef')
      

      在这里,我希望您的定位器是正确的。

      【讨论】:

      • 文件“”,第 14 行 pwdElement.send_keys('cdef') SyntaxError: invalid syntax pwdElement.send is a invaild syntex...
      • 它是否通过了第一个块,即添加用户名?
      • @youngyoung 复制粘贴 qoute 的代码时可能存在问题。尝试手动添加报价。
      【解决方案4】:

      它位于您需要首先切换到的框架中。此外,尽可能使用 id,因为它们更快。

      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
      
      url ="http://sugang.korea.ac.kr"
      driver = webdriver.Chrome()
      driver.get(url)
      WebDriverWait(driver,5).until(EC.visibility_of_element_located((By.CSS_SELECTOR,'[name=firstF]')))
      driver.switch_to.frame(driver.find_element_by_css_selector('[name=firstF]'))
      WebDriverWait(driver,5).until(EC.visibility_of_element_located((By.ID,'id'))).send_keys('abc')
      driver.find_element_by_id('pw').send_keys('def')
      driver.find_element_by_id('loginButton').click()
      

      【讨论】:

        【解决方案5】:

        您尝试访问的站点没有带有标签名称 id 的元素。仔细检查网站。

        <input name="id">
        

        如果输入有 id 值,试试这个;

        driver.find_element_by_id("id")
        

        使用示例:

        HTML:

        <div class="form-group">
            <input class="form-control" name="username">
        </div>
        <div class="form-group">
            <input class="form-control" name="password" type="password">
        </div>
        <button id="btn-login"  type="submit">Enter</button>
        

        Python:

        username = driver.find_element_by_name("username")
        password = driver.find_element_by_name("password")
        
        username.send_keys("your_username")
        password.send_keys("your_password")
        
        driver.find_element_by_id("btn-login").click()
        

        【讨论】:

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