Возможность очистить текстовое поле, но не может отправить новый текст - PullRequest
0 голосов
/ 03 февраля 2020

Я пытаюсь извлечь таблицу с веб-сайта, используя 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">

1 Ответ

0 голосов
/ 03 февраля 2020

Соответствующий HTML желаемого элемента помог бы нам лучше проанализировать проблему.

Однако, чтобы найти и вызвать click() / clear() / send_keys() для элемента, который вам нужно вызвать WebDriverWait для element_to_be_clickable(), и вы можете использовать любой из следующих Стратегии локатора :

  • Использование 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")
    
  • Примечание : необходимо добавить следующие операции импорта:

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