【问题标题】:How to insert a value in a field Text using Selenium?如何使用 Selenium 在文本字段中插入值?
【发布时间】:2021-12-30 21:36:51
【问题描述】:

我无法使用 Selenium Python 在 html 公式的字段文本中插入值:

我有这个 HTML:

<div data-react-toolbox="input" class="_2dBwA"><input type="text" placeholder="Endereço de e-mail" class="_2WvFs" role="input"><span class="fT1WI"></span></div>

还有这个 XPath:

(Copy Xpath) //*[@id="root"]/div/div[2]/div[2]/div/input

还有这个:

(Copy outerHTML) <input type="text" placeholder="Endereço de e-mail" class="_2WvFs" role="input">

我做到了,但没有用:

[In]: login_name = 'Cassandra'
[In]: insert_login_name = driver.find_element_by_xpath('//input[@id="root"]')
[In]: insert_login_name.send_keys(login_name);

[Out]: NoSuchElementException:  Message: no such element: Unable to locate element: {"method":"xpath","selector":"//input[@id="root"]"}

在此文本字段中输入文本后,结果将是 html 'values' = 'Cassandra'

<div data-react-toolbox="input" class="_2dBwA"><input type="text" placeholder="Endereço de e-mail" class="_2WvFs _3QmiH" role="input" value='Cassandra'><span class="fT1WI"></span></div>

我能做什么?我是新来的。谢谢

【问题讨论】:

  • 错误信息非常清楚:selenium 无法在给定的 xpath 中找到元素。我建议使用 find_element_by_id('root') 而不是尝试使用 xpath。
  • 不工作。 insert_login_name = driver.find_elements_by_id("root") 然后我做了 insert_login_name.send_keys('Cassandra');结果是 AttributeError: 'list' object has no attribute 'send_keys'
  • 检查输入元素上方是否有 iframe。那里好像有 iframe?

标签: python selenium selenium-webdriver


【解决方案1】:

desired element 是启用了ReactJS 的元素,因此要在元素中发送字符序列,您必须为element_to_be_clickable() 诱导WebDriverWait,然后您可以使用以下任一Locator Strategies

  • 使用CSS_SELECTOR

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "div[data-react-toolbox='input']>input[placeholder='Endereço de e-mail'][type='text']"))).send_keys(login_name)
    
  • 使用XPATH

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//div[@data-react-toolbox='input']/input[@placeholder='Endereço de e-mail' and @type='text']"))).send_keys(login_name)
    
  • 注意:您必须添加以下导入:

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

更新

似乎这是一个语言环境问题。将 placeholder 属性的 Endereço de e-mail 更改为 E-mail address 效果很好。

  • 使用CSS_SELECTOR:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "div[data-react-toolbox='input']>input[placeholder*='mail'][type='text']"))).send_keys(login_name)
    
  • 使用XPATH

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//div[@data-react-toolbox='input']/input[contains(@placeholder, 'mail') and @type='text']"))).send_keys(login_name)
    

参考

您可以在以下位置找到相关的详细讨论:

【讨论】:

  • @Gizélly 查看更新的答案并告诉我状态。
  • 更新 xpath 后即可使用!谢谢,我昨天不明白,但今天我明白你的工作了。感谢您的帮助!
【解决方案2】:

引入 WebDriverWaitelement_to_be_clickable() 以及后续的 css 选择器。

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.Chrome()
driver.get("https://www.atlasgov.com/login")
WebDriverWait(driver,20).until(EC.element_to_be_clickable((By.CSS_SELECTOR,'div[data-react-toolbox="input"] >input[placeholder="E-mail address"][role="input"]'))).send_keys("Cassandra")

浏览器快照:


更新了 Xpath。


WebDriverWait(driver,20).until(EC.element_to_be_clickable((By.XPATH,'//div[@data-react-toolbox="input" and @class="_2dBwA"]/input[@role="input"]'))).send_keys("Cassandra")

WebDriverWait(driver,20).until(EC.element_to_be_clickable((By.XPATH,'(//div[@data-react-toolbox="input"]//input[@role="input"])[1]'))).send_keys("Cassandra")

【讨论】:

  • 不工作.. TimeoutException:消息:-------TimeoutException T
  • 您提供的链接在英国位置有效。等待我为您提供另一个解决方案。
  • @Gizélly :尝试更新 xpath 并告诉我状态?
  • 我已经更新了另一个xpath。使用那个。这样更方便。
【解决方案3】:

错误信息非常清楚:selenium 无法在给定的 xpath 中找到元素。因为你有元素的 id,所以直接使用它而不是 xpath。

driver.find_element_by_id('root')

【讨论】:

  • 不工作。 insert_login_name = driver.find_elements_by_id("root") 然后我做了 insert_login_name.send_keys('Cassandra');结果是 AttributeError: 'list' object has no attribute 'send_keys' –
  • @Gizélly 仔细检查您输入的内容。这与我在这里的答案不同。
  • driver.find_elements_by_id("root") 返回 '[]'
  • @Gizélly 有两个问题。 1. find_elements... 返回元素的列表,而不是单个元素。这就是您收到错误的原因。您可以将其更改为 find_element...,但随后您将收到与之前相同的错误消息,即未找到该元素。 2. 没有id为root的元素。这可能与您的原始错误有关。您需要为您想要的元素找到正确的选择器。您原来的 xpath 不正确。
【解决方案4】:

这是关于错误定位器xpath 的问题。虽然在给定的 Html 中没有 IDroot 的元素,但似乎可以有任何父节点以 IDroot 请尝试根据提供的 html 使用给定的 xpath。希望它会工作:

driver.find_element_by_xpath("//input[@placeholder='Endereço de e-mail']");

【讨论】:

  • 不起作用:InvalidSelectorException:消息:无效选择器:由于以下错误,无法使用 xpath 表达式 //input[@placeholder='Endereço de e-mail'] 定位元素: SyntaxError: 无法对“文档”执行“评估”:字符串 '//input[@placeholder='Endereço de e-mail']' 不是有效的 XPath 表达式。
  • 那些引号字符无效。您应该使用'" 而不是
  • 是的,我正在用手机键盘打字
猜你喜欢
  • 2021-02-26
  • 1970-01-01
  • 2016-04-01
  • 2012-08-05
  • 2016-06-10
  • 1970-01-01
  • 2020-10-14
  • 1970-01-01
相关资源
最近更新 更多