【问题标题】:NoSuchElementException: Message: no such element: Unable to locate element: {"method":"name","selector":"username"} while sending text to usernameNoSuchElementException:消息:没有这样的元素:无法找到元素:{"method":"name","selector":"username"} 同时向用户名发送文本
【发布时间】:2018-12-31 02:15:52
【问题描述】:

需要帮助解决以下错误:

网址:https://services.gst.gov.in/services/login

username = driver.find_element_by_name("username");
File "C:\Users\admin\AppData\Local\Programs\Python\Python36\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 495, in find_element_by_name
    return self.find_element(by=By.NAME, value=name)
  File "C:\Users\admin\AppData\Local\Programs\Python\Python36\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 966, in find_element
    'value': value})['value']
  File "C:\Users\admin\AppData\Local\Programs\Python\Python36\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 320, in execute
    self.error_handler.check_response(response)
  File "C:\Users\admin\AppData\Local\Programs\Python\Python36\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"name","selector":"username"}

【问题讨论】:

标签: python selenium selenium-webdriver nosuchelementexception webdriverwait


【解决方案1】:

您需要使用 javascript executor 引入 Javascript。您可以尝试的代码:

只需更改为:

 driver.execute_script('arguments[0].click();',WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, 'username'))))
 WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, 'username'))).send_keys("abc")

完整的代码是这样的:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC 
from selenium.webdriver.common.action_chains import ActionChains
import time

driver   = webdriver.Chrome(executable_path = r'C:/Users/user**/Downloads/chromedriver_win32/chromedriver.exe')
driver.maximize_window()

wait = WebDriverWait(driver,40)

driver.get("https://services.gst.gov.in/services/login") 

driver.execute_script('arguments[0].click();',wait.until(EC.element_to_be_clickable((By.ID, 'username'))))
wait.until(EC.element_to_be_clickable((By.ID, 'username'))).send_keys("abc")

【讨论】:

    【解决方案2】:

    您在查找元素时使用了元素的 id 值而不是名称值。请更改以下任一选项中的代码

    通过使用 ID:

    username = driver.find_element_by_id("username");
    

    使用名称:

    username = driver.find_element_by_name("user_name");
    

    【讨论】:

      【解决方案3】:

      要识别字符序列并将其发送到标有 用户名 文本的 <input> 字段,您必须诱导 WebDriverWait 以使所需的元素可点击 然后使用execute_script() 方法发送文本如下:

      • 代码块:

        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
        
        options = webdriver.ChromeOptions() 
        options.add_argument("start-maximized")
        options.add_argument('disable-infobars')
        driver=webdriver.Chrome(chrome_options=options, executable_path=r'C:\Utility\BrowserDrivers\chromedriver.exe')
        driver.get("https://services.gst.gov.in/services/login")
        element = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input.form-control.pad-r-0.ng-pristine.ng-empty.ng-invalid.ng-invalid-required.ng-valid-maxlength.ng-touched#username")))
        driver.execute_script("arguments[0].click();", element)
        element.send_keys("charan teja")
        

      浏览器快照:

      【讨论】:

      • 为什么我们需要input.form-control.pad-r-0.ng-pristine.ng-empty.ng-invalid.ng-invalid-required.ng-valid-maxlength.ng-touched#username这个css选择器,当我们有唯一ID时。
      • @cruisepandey 你没有为社区增加任何价值,在很短的时间间隔内一次又一次地在不同的讨论中提出相同的问题。您既没有阅读文档,也不愿意提出问题。 StackOverflow 志愿者有什么方法可以帮助您吗?
      • 很高兴知道我没有向社区添加任何内容。您能否分享任何提到我们应该更喜欢 css 选择器而不是 id 的链接。我只是想知道为什么有人会使用长的 css 选择器,当他们有一个简单的选项来使用 ID 时。这对我和社区也没有任何意义。相反,您应该先浏览文件。提出这个要求的新问题有什么意义。
      【解决方案4】:

      我更喜欢使用 find_element_by_xpath,因为 xpath 在 chrome 中很容易找到。

      方法如下:右键单击 -> 检查 -> 右键单击​​ -> 复制 -> CopyXpath

      browser.find_element_by_xpath(xpath)

      当然,也有不利的一面。 当网站更新时,通过 xpath 查找的内容也应该更新。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-09
        • 1970-01-01
        • 1970-01-01
        • 2020-03-18
        • 2021-12-20
        相关资源
        最近更新 更多