Очистка селена и ввод текста в текстовом поле [Python] - PullRequest
0 голосов
/ 14 января 2020

Я использую Selenium, чтобы сделать кое-что. Я использовал следующий код для ввода текста в текстовое поле textarea:

def clear_and_send_key_then_wait(element, key, sleep_time = 1):
# For some reason this does not work
#     element.clear() 

# This works
    element.send_keys(Keys.CONTROL + "a");
    element.send_keys(Keys.DELETE);

# Input text
    element.send_keys(key)
    time.sleep(sleep_time)

target_textbox = driver.find_element_by_xpath(
"""/html/body/div[2]/div/div[2]/div[1]/div[4]/div[1]/div/textarea""")
clear_and_send_key_then_wait(target_textbox, 'z'*100000)

Q1: Почему element.clear() не удаляет существующий текст в текстовом поле?

Поскольку в текстовое поле нужно набирать много текстов, описанный выше метод слишком медленный. Вместо этого я использую первый Javascript метод execute_script предложенный здесь .

Однако простое выполнение следующего не заполняет текстовое поле.

driver.execute_script("arguments[0].value=arguments[1];", 
                      target_textbox, "z"*100000)

Текст появляется только после следующей команды send_key, следующей сразу за строкой execute_script:

driver.execute_script("arguments[0].value=arguments[1];", 
                      target_textbox, "z"*100000)
target_textbox.send_keys(Keys.ENTER)

Q2: Почему требуется следующий target_textbox.send_keys(Keys.ENTER)? Вроде как в ссылке автору не нужно отправлять клавишу ввода. Это другой тип текстового поля? Если да, то каковы различные типы текстовых полей, и все ли они имеют различное поведение?

Заранее спасибо!

1 Ответ

2 голосов
/ 15 января 2020

Selenium не запускает никакие события клавиатуры или мыши в открытом виде. То же самое происходит, когда вы устанавливаете значение с помощью JavaScript. Вероятно, веб-сайт ожидает, когда событие keys продолжит некоторую работу для значения текстовой области, и триггер для этого будет send_keys с любой клавишей.

Вы можете попробовать код ниже, \ue007 - это клавиша Enter:

driver.execute_script("arguments[0].value=arguments[1];", target_textbox, "z"*100000 + "\ue007")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...