【问题标题】:Setting a value in a text field using selenium. selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element:使用 selenium 在文本字段中设置值。 selenium.common.exceptions.NoSuchElementException:消息:无法找到元素:
【发布时间】:2018-10-11 08:44:44
【问题描述】:

我是网络爬虫和 python 的新手。我的任务是使用 selenium 为提及 URL 设置文本框名称“rcdate”的值。然后抓取被过滤的值。当它运行时,它会给出这个异常。这是我尝试运行的代码

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 


browser = webdriver.Firefox()
browser.get("http://www.irrigation.gov.lk/index.php?option=com_reservoirdata&Itemid=255&lang=en")

wait = WebDriverWait(browser, 10)
wait.until(EC.presence_of_element_located((By.ID, 'rcdate')))

browser.find_element_by_tag_name("rcdate").send_keys("2018-10-01")

那么Error Msg就是

selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: rcdate

HTML

<input type="text" name="rcdate" id="rcdate" value="2018-10-11">

【问题讨论】:

  • 发布相关的html。
  • 文本框 HTML &lt;input type="text" name="rcdate" id="rcdate" value="2018-10-11"&gt;
  • 是否有任何名称为“rcdate”的标签,如果没有则不要使用行 browser.find_element_by_tag_name("rcdate").send_keys("2018-10-01")

标签: python selenium selenium-webdriver css-selectors webdriverwait


【解决方案1】:

我在尝试访问 url http://www.irrigation.gov.lk/index.php?option=com_reservoirdata&amp;Itemid=255&amp;lang=en 时收到 ERROR 403 - FORBIDDEN

但是,一旦您找到元素并在尝试调用 send_keys() 方法时向前移动,因此您应该使用 element_to_be_clickable() 而不是 expected_conditions 作为 presence_of_element_located(),如下所示: p>

  • CSS_SELECTOR:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "#rcdate"))).send_keys("2018-10-01")
    
  • ID:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.ID, "rcdate"))).send_keys("2018-10-01")
    

【讨论】:

  • 有什么办法可以替换现有的文本框值。然后我需要从代码中传递值。
  • 虽然此代码可能有效,但所描述的解决方案与实际问题无关:它不是等待元素可点击,而是选择器策略错误,因此其他两个答案似乎更有用跨度>
  • @Haz Of-coarse 可以 ...用新值替换现有文本框值... 使用 execute_script() i> 方法。随时根据您的新要求提出新问题。贡献者将很乐意为您提供帮助。
  • @DebanjanB 是的,当然。谢谢
【解决方案2】:

使用

find_element_by_name() # locate element by the "name" attribute

不要混淆

find_element_by_tag_name() # locate element by the element tag ("input" in this case)

【讨论】:

    【解决方案3】:

    你在这行做错了,所以 使用这条线,

    browser.find_element_by_tag_name("rcdate").send_keys("2018-10-01")
    

    没有意义,因为不存在这样的标签,而您使用的是标签名称“rcdate”,

    使用任何一个,

    browser.find_element_by_id("rcdate").send_keys("2018-10-01")
    browser.find_element_by_name("rcdate").send_keys("2018-10-01")
    

    希望对你有帮助

    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 
    
    
    browser = webdriver.Firefox()
    browser.get("http://www.irrigation.gov.lk/index.php?option=com_reservoirdata&Itemid=255&lang=en")
    
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "#rcdate"))).send_keys("2018-10-01")
    

    【讨论】:

    • 感谢@Ashish 的帮助。它正在工作。我需要替换现有的文本框值。然后我需要从代码中传递值。有什么机制吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多