python-3.x - 网页抓取:尝试填写此网站上的表单时出现 ElementNotInteractableException
问题描述
我一直在尝试从这个网站上抓取数据。我需要填写获取您的汽车表格的准确价格,即。年份,品牌,型号等。到目前为止,我已经编写了以下代码:
import requests
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait, Select
from selenium.common.exceptions import NoSuchElementException
from selenium.common.exceptions import StaleElementReferenceException
from selenium.webdriver.support import expected_conditions
from bs4 import BeautifulSoup
import re
chrome_options = webdriver.ChromeOptions()
driver = webdriver.Chrome('chromedriver_win32/chromedriver.exe', options=chrome_options)
url = "http://www.indianbluebook.com/"
driver.get(url)
save_city = driver.find_element_by_xpath('//*[@id="cityPopup"]/div[2]/div/div[2]/form/div[2]/div/a[1]').click() #Bangalore
#fill year
year_dropdown = Select(driver.find_element_by_xpath('//*[@id="car_value"]/div[2]/div[1]/div[1]/div/select'))
driver.implicitly_wait(50)
year_dropdown.select_by_value('2020')
time.sleep(5)
但是,它给出了这个错误:
ElementNotInteractableException Traceback (most recent call last)
<ipython-input-25-a4eb8001e649> in <module>
8 year_dropdown = Select(driver.find_element_by_xpath('//*[@id="car_value"]/div[2]/div[1]/div[1]/div/select'))
9 driver.implicitly_wait(50)
---> 10 year_dropdown.select_by_value('2020')
11
12 time.sleep(5)
~\anaconda3\lib\site-packages\selenium\webdriver\support\select.py in select_by_value(self, value)
80 matched = False
81 for opt in opts:
---> 82 self._setSelected(opt)
83 if not self.is_multiple:
84 return
~\anaconda3\lib\site-packages\selenium\webdriver\support\select.py in _setSelected(self, option)
210 def _setSelected(self, option):
211 if not option.is_selected():
--> 212 option.click()
213
214 def _unsetSelected(self, option):
~\anaconda3\lib\site-packages\selenium\webdriver\remote\webelement.py in click(self)
78 def click(self):
79 """Clicks the element."""
---> 80 self._execute(Command.CLICK_ELEMENT)
81
82 def submit(self):
~\anaconda3\lib\site-packages\selenium\webdriver\remote\webelement.py in _execute(self, command, params)
631 params = {}
632 params['id'] = self._id
--> 633 return self._parent.execute(command, params)
634
635 def find_element(self, by=By.ID, value=None):
~\anaconda3\lib\site-packages\selenium\webdriver\remote\webdriver.py in execute(self, driver_command, params)
319 response = self.command_executor.execute(driver_command, params)
320 if response:
--> 321 self.error_handler.check_response(response)
322 response['value'] = self._unwrap_value(
323 response.get('value', None))
~\anaconda3\lib\site-packages\selenium\webdriver\remote\errorhandler.py in check_response(self, response)
240 alert_text = value['alert'].get('text')
241 raise exception_class(message, screen, stacktrace, alert_text)
--> 242 raise exception_class(message, screen, stacktrace)
243
244 def _value_or_default(self, obj, key, default):
ElementNotInteractableException: Message: element not interactable: Element is not currently visible and may not be manipulated
(Session info: chrome=85.0.4183.102)
注意:我在互联网上尝试了许多可用的解决方案,例如使用 WebDriverWait 的预期条件。有时我得到错误,StaleElementException
. 我不知道现在该怎么办。请帮忙。我是新手。
解决方案
您可以使用以下方法来实现相同的目的。
#Set link according to data need
driver.get('http://www.indianbluebook.com/')
#Wait webpage to fully load necessary tables
def ajaxwait():
for i in range(1, 30):
x = driver.execute_script("return (window.jQuery != null) && jQuery.active")
time.sleep(1)
if x == 0:
print("All Ajax element loaded successfully")
break
ajaxwait()
wait = WebDriverWait(driver, 20)
wait.until(EC.element_to_be_clickable((By.XPATH, "//*[@id='cityPopup']/div[2]/div/div[2]/form/div[2]/div/a[1]")))
save_city = driver.find_element_by_xpath('//*[@id="cityPopup"]/div[2]/div/div[2]/form/div[2]/div/a[1]').click() #Bangalore
ajaxwait()
#fill year
wait.until(EC.element_to_be_clickable((By.XPATH, "//div[@class='form-group']//select[@class='form-control' and @name='manufacture_year']/following-sibling::div/a")))
#//div[@class='form-group']//select[@class='form-control' and @name='manufacture_year'] this is the only unique elemnt with reference to this we can find other element.
#click on select year field then a dropdown will be open we will enter the year in the input box. Then select the item from the ul list.
driver.find_element_by_xpath("//div[@class='form-group']//select[@class='form-control' and @name='manufacture_year']/following-sibling::div/a").click()
driver.find_element_by_xpath("//div[@class='form-group']//select[@class='form-control' and @name='manufacture_year']/following-sibling::div//input").send_keys("2017")
driver.find_element_by_xpath("//div[@class='form-group']//select[@class='form-control' and @name='manufacture_year']/following-sibling::div//em").click()
@name='manufacture_year'
同样,您可以通过更改属性值来选择其他下拉列表。
注意:用 Ajax 等待更新了代码。
推荐阅读
- azure - 如何使用 arm-template-parameters-definition.json 文件自定义参数化 ADF 复制活动设置?
- python - 如何在没有按钮的情况下提交 recaptcha v2 表单?
- powerpoint - 使用 Office API 在演示模式下更新 PowerPoint 幻灯片元素
- amazon-web-services - 重复数据删除缓存
- css - 以相同大小和响应式显示图像,bootstrap 4 和 django
- ios - 如何在另一个视图中获取在 UIView 中点击了哪个特定按钮的信息
- node.js - 您如何导出自定义环境模块声明以供消费者使用?
- windows - Mosquitto 代理上的客户端连接数量增加
- excel - 遍历文件夹和子文件夹以查找 *csv 文件 excel VBA
- python - TypeError:预期的 str、字节或 os.PathLike 对象,而不是 dict