可以清除文本框,但无法发送新文本

问题描述 投票:0回答:1

[我正在尝试使用python硒从网站中提取表。在网页中,我需要选择所需的日期。对于日和月,有两个下拉框。对于这两个我正在使用CSS选择器,并能够选择日期和月份。但是问题在于年份。这是一个文本框,当前年份的默认值为“ 2020”。所以首先我只是尝试发送“ 2019”作为输入。但这无法正常工作并返回默认的页面数据,即当前的日期数据。

然后,我尝试清除文本框,然后将输入作为“ 2019”发送。此方法返回带有NAN的表。如何发送2019作为年份的输入?

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.keys import Keys
from datetime import datetime, timedelta
from math import ceil
import pandas as pd
import numpy as np
from time import time, sleep
import re

CHROMEDRIVER_PATH = '/path /to/chromedriver'

options = Options()
options.add_argument('--headless')
options.add_argument('--disable-gpu')
driver = webdriver.Chrome(CHROMEDRIVER_PATH, chrome_options=options)

driver.get("URL")
# date = datetime.now() - timedelta(days=1)
date = datetime(2019,11,4)
year = date.strftime("%Y")
month = date.strftime("%m")
day = date.strftime("%d")
date = date.strftime("%Y-%m-%d")

driver.find_element_by_css_selector("#ContentPlaceHolder2_txtyear").clear() #Clear the default value from the box
sleep(1)
driver.find_element_by_css_selector("#ContentPlaceHolder2_txtyear").send_keys(year) #Send the year as a string
sleep(1)
driver.find_element_by_css_selector("#ContentPlaceHolder2_txtyear").send_keys(Keys.ENTER) #Hit enter after sending the key
sleep(1)

driver.find_element_by_css_selector("#ContentPlaceHolder2_ddmonth").send_keys(month) #Send input for month
driver.find_element_by_css_selector("#ContentPlaceHolder2_ddday").send_keys(day) # send input for day

html = driver.page_source

pd.read_html(html)[0]

编辑:来自源代码的年份文本框元素如下:

<input name="ctl00$ContentPlaceHolder2$txtyear" type="text" value="2020" onchange="javascript:setTimeout('__doPostBack(\'ctl00$ContentPlaceHolder2$txtyear\',\'\')', 0)" onkeypress="if (WebForm_TextBoxKeyHandler(event) == false) return false;" id="ContentPlaceHolder2_txtyear" style="height:16px;width:46px;margin-left: 0px">

python selenium selenium-webdriver sendkeys
1个回答
0
投票

所需元素的相关HTML本可以帮助我们以更好的方式分析问题。

但是,要在元素上定位并调用click() /clear()/ send_keys(),您需要为element_to_be_clickable()引入WebDriverWait,并且可以使用以下Locator Strategies中的任何一个:

  • 使用CSS_SELECTOR

    element = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "#ContentPlaceHolder2_txtyear")))
    element.click()
    element.clear()
    element.send_keys("user11593389")
    
  • 使用XPATH

    element = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//*[@id='ContentPlaceHolder2_txtyear']")))
    element.click()
    element.clear()
    element.send_keys("user11593389")
    
  • Note:您必须添加以下导入:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    
© www.soinside.com 2019 - 2024. All rights reserved.