如何通过Selenium和Python将文本发送到搜索字段

问题描述 投票:2回答:3

我试图使用Python中的Selenium将参数传递给HTML代码中的搜索文本:

我正在处理以下HTML代码:

</form><form class="search-box-inner">
    <div class="input-container">
        <input type="text" class="typeahead search-box-input left" autocomplete="off" placeholder="Search ratings, research, analysts, and more..." maxlength="900"></div>
</form>

代码没有id或名称。它只有类别的元素。

我尝试了以下内容

self.driver.find_elements_by_class_name('search-box-inner').send_keys("HSBC Bank plc")  

但是我收到以下错误:

AttributeError: 'list' object has no attribute 'send_keys'

然后我尝试获取列表的第一个元素并使用以下代码发送密钥:

self.driver.find_elements_by_class_name('search-box-inner')[0].send_keys("HSBC Bank plc")

我收到以下错误:

"selenium.common.exceptions.WebDriverException: Message: unknown error: cannot focus element"

我已经尝试了上述两种类型的“预先搜索框输入左侧”类。它会抛出同样的错误。以下是我用于此的代码:

self.driver.find_elements_by_xpath("//*[@class='typeahead search-box-input left']").send_keys("HSBC Bank plc")

我再次收到以下错误:

AttributeError: 'list' object has no attribute 'send_keys'

然后我尝试使用以下代码获取列表的第一个元素:

self.driver.find_elements_by_xpath("//*[@class='typeahead search-box-input left']").[0].send_keys("HSBC Bank plc")  

我再次收到以下错误:

selenium.common.exceptions.ElementNotVisibleException: Message:
element not interactable

我也尝试了以下方式:

element = wait.until(Ec.visibility_of_element_located((By.XPATH, "//*[@placeholder='Search ratings, research, analysts, and more...']")))

但无法将参数/键发送到搜索栏。 任何建议都会非常有帮助。

python selenium selenium-webdriver xpath css-selectors
3个回答
2
投票

find_elements_by_xpath返回一个webelement列表,这就是你不能直接使用send_keys方法的原因。如果你需要在元素上使用find_element_by_xpath,你需要使用find_elements_by_xpath("xpathExpression").get(0)send_keys

请尝试以下建议来解决您的问题:

  1. 尝试使用xpath self.driver.find_element_by_xpath("//div[@class='input-container']")而不是您正在使用的xpath。
  2. 即使使用上面的xpath后如果你得到ElementNotVisibleException那么请检查元素是否在iframe中,如果是,然后切换到iframe然后在元素上使用send_keys。 要切换到iframe,您可以使用上面提到的xpath在元素上使用:driver.switch_to.frame(driver.find_element_by_tag_name('iframe'))然后使用send_keys,如果要切换回默认内容,可以使用driver.switch_to.default_content()

0
投票

为什么不使用css选择器,例如

.find_element_by_css_selector(".search-box-input").send_keys 

您可以扩展选择器,例如,使用:

.search-box-input[placeholder^='Search ratings']

0
投票

根据您提供的HTML,很明显<form>中存在多个HTML DOM节点。


分析错误

  • 第一次尝试:self.driver.find_elements_by_class_name('search-box-inner')将返回一个List,所以你不能调用send_keys(),你看到错误为AttributeError: 'list' object has no attribute 'send_keys'
  • 第二次尝试:self.driver.find_elements_by_class_name('search-box-inner')[0]将识别无法聚焦的<form>节点,因此您无法调用send_keys()并且您将错误视为WebDriverException: Message: unknown error: cannot focus element"
  • 第三次尝试:self.driver.find_elements_by_xpath("//*[@class='typeahead search-box-input left']")将再次返回一个List,所以你不能调用send_keys(),你会看到错误为AttributeError: 'list' object has no attribute 'send_keys'
  • 第四次尝试:self.driver.find_elements_by_xpath("//*[@class='typeahead search-box-input left']").[0]不是有效的Locator Strategy

要将字符序列传递给所需元素,您可以使用以下任一解决方案:

  • 使用CSS_SELECTORself.driver.find_element_by_css_selector("form.search-box-inner input.typeahead.search-box-input.left[placeholder^='Search ratings']").send_keys("HSBC Bank plc")
  • 使用XPATHself.driver.find_element_by_xpath("//form[@class='search-box-inner']//input[@class='typeahead search-box-input left' and starts-with(@placeholder, 'Search ratings')]").send_keys("HSBC Bank plc")
© www.soinside.com 2019 - 2024. All rights reserved.