Как очистить ввод текста?

Я уже некоторое время пытаюсь решить эту проблему, ни один из существующих вопросов не помогает. Я использую реализация узла Selenium WebDriver, версию ^ 4.0.0-альфа.1 и тестирую его в Chrome с помощью последней версии ChromeDriver.

Я пытаюсь очистить текст <input/>, у которого type = "email". В WebDriver для этого есть встроенная команда, но когда я его выполняю, ввод не очищается (и ошибки нет):

// This populates the text field, no problem
driver.findElement(By.id("model-auth-email")).sendKeys("[email protected]");

// This is executed without error, but nothing happens, text field isn't cleared
driver.findElement(By.id("model-auth-email")).clear();

Я не могу использовать метод CTRL + a и BACKSPACE, так как я использую Mac, и это будет CMD + a. И у ChromeDriver были (до сих пор не решенные) проблемы с поддержкой ввода кнопок OSX CMD в течение примерно 6 лет, согласно различным темам, которые я смог найти.

Я также мог бы сделать что-то вроде цикла входов BACKSPACE, пока он не очистится, хотя это довольно взломано.

Есть идеи, почему .clear() тихо не работает?

Вы уверены, что разместили правильную ссылку на github?

shkaper 10.12.2018 01:42

@shkaper да, это правильный вариант

Jayce444 10.12.2018 01:47
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
5
2
4 310
3

Ответы 3

Из документа WebdriverfindElement вернет обещание, поэтому вы можете попробовать:

driver.findElement(By.id("model-auth-email"))
  .then((el) => {
  el.clear()
  })
  .catch(e => {
    throw e; 
  });

Да, я пробовал это изначально, я не использую синтаксис обещания в своем вопросе, потому что я настроил свои тесты для работы немного другим способом, используя async / await и / или связывая группу и имея только .then() на последний. Но да, попробовал ваше предложение, и оно все еще не работает :(

Jayce444 10.12.2018 02:06

Правильно ли "model-auth-email"? Может быть, вы можете попытаться найти этот элемент с помощью селектора xpath или css ...

Chau Giang 10.12.2018 02:13

Это правильно, потому что он в первую очередь находит элемент, чтобы заполнить его. Он может добавить к нему текст, просто не очистит его

Jayce444 10.12.2018 02:21

Что нам кажется эффективным, так это:

  1. Используйте JavaScript для выполнения метода select() элемента <input>.
  2. Затем используйте Selenium WebDriver для отправки ключа BACKSPACE.

Вот функция clear, которая сделает это:

async function clear(drv, web_elt) {
  await drv.executeScript(elt => elt.select(), web_elt);
  await web_elt.sendKeys(Key.BACK_SPACE);
}

Согласно которому:

  • drv - это экземпляр WebDriver
  • web_elt - это экземпляр WebElement
  • Анонимная функция в executeScript преобразована в строку и получает элемент <input>, завернутый в web_elt, в качестве параметра.

Найдите ниже демонстрацию и полный код для нее.


Это работает на Node.js 11 с selenium-webdriver v4.
Убедитесь, что ваш хромированный драйвер находится в вашем PATH, затем запустите node index.js

// index.js
const path = require('path');
const wd = require('selenium-webdriver');
const {Key} = wd;

const driver =
  (new wd.Builder)
    .forBrowser(wd.Browser.CHROME)
    .build();

async function clear(drv, web_elt) {
  await drv.executeScript(elt => elt.select(), web_elt);
  await web_elt.sendKeys(Key.BACK_SPACE);
}

async function run(drv) {
  await drv.get('file://' + path.join(__dirname, 'index.html'));
  await drv.sleep(1000);
  await clear(drv, drv.findElement({css: 'input'}));
  await drv.sleep(1000);
  await clear(drv, drv.findElement({css: 'textarea'}));
  await drv.sleep(1000);
  await drv.quit();
}

run(driver);
<!-- index.html -->
<html>
  <body>
    <p>
      <input type = "text" value = "Hello World!"/>
    </p>
    <p>
      <textarea cols = "30" rows = "10">Hello World!</textarea>
    </p>
  </body>
</html>

Я пробовал так много разных методов, но это единственный, который у меня сработал на Mac + Chrome. Спасибо!

Jay Wick 24.06.2020 07:53

У меня была такая же проблема, и .clear () или CTRL + 'a' у меня не работали, этот работал отлично:

driver.execute_script("arguments[0].value = '';", text_input)

Другие вопросы по теме