我试图使用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...']")))
但无法将参数/键发送到搜索栏。 任何建议都会非常有帮助。
find_elements_by_xpath
返回一个webelement列表,这就是你不能直接使用send_keys
方法的原因。如果你需要在元素上使用find_element_by_xpath
,你需要使用find_elements_by_xpath("xpathExpression").get(0)
或send_keys
。
请尝试以下建议来解决您的问题:
self.driver.find_element_by_xpath("//div[@class='input-container']")
而不是您正在使用的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()
为什么不使用css选择器,例如
.find_element_by_css_selector(".search-box-input").send_keys
您可以扩展选择器,例如,使用:
.search-box-input[placeholder^='Search ratings']
根据您提供的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_SELECTOR
:
self.driver.find_element_by_css_selector("form.search-box-inner input.typeahead.search-box-input.left[placeholder^='Search ratings']").send_keys("HSBC Bank plc")
XPATH
:
self.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")