Я уже некоторое время пытаюсь решить эту проблему, ни один из существующих вопросов не помогает. Я использую реализация узла 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() тихо не работает?
@shkaper да, это правильный вариант



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Из документа WebdriverfindElement вернет обещание, поэтому вы можете попробовать:
driver.findElement(By.id("model-auth-email"))
.then((el) => {
el.clear()
})
.catch(e => {
throw e;
});
Да, я пробовал это изначально, я не использую синтаксис обещания в своем вопросе, потому что я настроил свои тесты для работы немного другим способом, используя async / await и / или связывая группу и имея только .then() на последний. Но да, попробовал ваше предложение, и оно все еще не работает :(
Правильно ли "model-auth-email"? Может быть, вы можете попытаться найти этот элемент с помощью селектора xpath или css ...
Это правильно, потому что он в первую очередь находит элемент, чтобы заполнить его. Он может добавить к нему текст, просто не очистит его
Что нам кажется эффективным, так это:
select() элемента <input>.Вот функция clear, которая сделает это:
async function clear(drv, web_elt) {
await drv.executeScript(elt => elt.select(), web_elt);
await web_elt.sendKeys(Key.BACK_SPACE);
}
Согласно которому:
drv - это экземпляр WebDriverweb_elt - это экземпляр WebElementexecuteScript преобразована в строку и получает элемент <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. Спасибо!
У меня была такая же проблема, и .clear () или CTRL + 'a' у меня не работали, этот работал отлично:
driver.execute_script("arguments[0].value = '';", text_input)
Вы уверены, что разместили правильную ссылку на github?