问题描述
尝试使用Python将文本发送到文本字段时遇到一个非常奇怪的问题。
这是我的代码:
keyword_text_field = driver.find_element_by_xpath('//*[@id="558450155"]')
keyword_text_field.clear()
keyword_text_field.send_keys('Ford')
search_button = driver.find_element_by_xpath('//*[@id="mountNode"]/div/div[4]/div[3]/div[1]/div[1]/div/div[2]/div/div[18]/div[2]/button')
search_button.click()
网址如下: :
这是我得到的错误:
File "/Users/rodrigopeniche/Documents/workspace/WebScraping/AutoTraderScraper.py", line 34, in search_for_keyword
keyword_text_field.send_keys('Ford')
File "/Library/Python/2.7/site-packages/selenium/webdriver/remote/webelement.py", line 478, in send_keys
{'text': "".join(keys_to_typing(value)),
File "/Library/Python/2.7/site-packages/selenium/webdriver/common/utils.py", line 150, in keys_to_typing
for i in range(len(val)):
TypeError: object of type 'WebElement' has no len()
我的环境技术规格如下:
- Python 2.7
- 铬68.0.3440.106
- Chromedriver 2.42
- 硒3.13
知道为什么会这样吗? 将键发送到同一站点中的其他文本字段时,我没有问题。
1楼
您不清楚发生什么错误,但是很可能需要等待元素。 同样,您可以获得更好的选择器,如下面的代码所示:
keyword_text_field = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.CSS_SELECTOR, ".accordion-panel-input input")))
keyword_text_field.clear()
keyword_text_field.send_keys('Ford')
driver.find_element_css_selector("button[type=submit]").click()
2楼
我无法使用相同的代码重现您的错误; 假设是由于浏览器,驱动程序或Selenium版本中的差异。
另外,请记住:不同的浏览器可以不同地解析HTML / XML,因此您可能会发现使用xPath的浏览器之间存在差异。 CSS选择器是更可取的,并且在更容易避免深度嵌套的路径的范围内,它也不那么脆弱。
环境
- 操作系统 :macOS 10.10.5
- 的Python :3.6.1
- 硒 :3.14.0
- 壁虎驱动程序 :0.21.0
- 的Firefox :62.0
码
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
driver = webdriver.Firefox()
driver.get("https://www.autotrader.com/cars-for-sale/searchresults.xhtml?zip=84025&keywordPhrases=rebuilt%20title&startYear=2014&endYear=2018&sellerTypes=p&searchRadius=0&sortBy=derivedpriceDESC&numRecords=25&firstRecord=0")
keyword_text_field = driver.find_element_by_xpath('//*[@id="558450155"]')
keyword_text_field.clear()
keyword_text_field.send_keys('Ford')
search_button = driver.find_element_by_xpath('//*[@id="mountNode"]/div/div[4]/div[3]/div[1]/div[1]/div/div[2]/div/div[18]/div[2]/button')
search_button.click()
driver.close()