我如何在 Python 到 select 日历日期中使用 selenium,因为 Python 不允许我点击任何东西,因为我无法点击列表?

How do I use selenium in Python to select a calendar date when Python won't let me click on anything because I can't click on lists?

我正在尝试单击此网站中的日历,以便我可以选择一个日期来查看该日期的天气:

Link

第一步是单击日历图标以显示日历,这样我就可以单击日期。当我右键单击该图标并检查它时,这是代码:

<input name="ctl00$MainContentHolder$txtPastDate" type="date" value="2022-01-07" id="ctl00_MainContentHolder_txtPastDate" class="form-control">

我尝试在 Python:

from selenium import webdriver as wd
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from bs4 import BeautifulSoup as bs
from pandas.io.html import read_html
driver=wd.Chrome()
driver.maximize_window()
driver.get('https://www.worldweatheronline.com/kaohsiung-weather-history/tai-wan/tw.aspx')
f=get_html(driver)
driver.implicitly_wait(10)
driver.find_elements_by_id('ctl00_MainContentHolder_txtPastDate').click()

我得到的是:

Traceback (most recent call last):

  File "<ipython-input-113-f6eee7773e00>", line 5, in <module>
    driver.find_elements_by_id('ctl00_MainContentHolder_txtPastDate').click()

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

我似乎无法点击任何东西,因为每当我提取某些东西时,Python 将该东西保存为列表,而列表不会点击。

我正在使用 Python 3.7.4 和 Spyder 4.0.1

请注意 find_elements return 网络元素列表,而不是单个网络元素。

此外,在 python list 上我们不能调用 .click 方法。解释你所遇到的错误。

所以不用

driver.find_elements_by_id('ctl00_MainContentHolder_txtPastDate').click()

使用这个:

driver.find_element_by_id('ctl00_MainContentHolder_txtPastDate').click()

好吧,如果您愿意,您也可以发送钥匙,并指定日期。并非每个网站都支持此功能(本网站有),但是当它存在时,您可以使用它。 您可以使用以下定位器策略。

driver.find_element(By.CSS_SELECTOR, "input[type='date']").send_keys("05-01-2022")

当然,不要将日期硬编码到代码中。将其保存在变量中。

wait=WebDriverWait(driver,30)                                 
driver.get('https://www.worldweatheronline.com/kaohsiung-weather-history/tai-wan/tw.aspx')

wait.until(EC.element_to_be_clickable((By.XPATH,"//button[.='AGREE']"))).click()
element=wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,"#ctl00_MainContentHolder_txtPastDate")))
value='2020-01-01'
driver.execute_script("arguments[0].setAttribute('value',arguments[1])",element, value)

wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,"a.introjs-skipbutton"))).click()
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,"#ctl00_MainContentHolder_butShowPastWeather"))).click()

要设置该值,您可以使用 javascript 进行设置,但首先删除同意按钮,更改单位,然后点击显示过去的天气。

进口:

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