无法清除使用 Selenium WebDriver 自动输入清晰和模糊文本的文本区域
Unable to clear textarea which auto inputs text on clear and blur using Selenium WebDriver
我正在使用 Java 使用 Selenium WebDriver。
我有一个文本区域,我想清除默认内容并在其中输入新内容。功能是这样的,如果我从 textarea 中清除文本并点击 Tab 按钮,那么默认文本将自动填充。
下面是 textarea 的 HTML:
<textarea autocomplete="off" class="form-control rd-control rd-control--textarea empty" cols="20" data-bind="value: offerTitle, expandedTextArea: offerTitle, valueUpdate: 'afterkeydown', customerRequiredFieldsBinding" id="CheckoutWelcomeTitle" name="CheckoutWelcomeTitle" placeholder="ex. Here comes the best offer" rows="1" type="text" data-autosize-on="true" style="overflow-y: hidden; height: 35.9792px;" onblur="setTextColorDefault(this)" oninput="setTextColor(this)">Let's bid on a discount code!</textarea>
我尝试使用:
driver.findElement(By.id("CheckoutWelcomeTitle")).clear()
但这没有用。
我也试过这个:
driver.findElement(By.id("CheckoutWelcomeTitle")).sendKeys(Keys.CONTROL + "a")
driver.findElement(By.id("CheckoutWelcomeTitle")).sendKeys(Keys.DELETE)
这有时有效,但并非总是有效。有时它会清除数据并重新填充默认文本。
有没有其他方法可以每次都有效地清除此文本区域?
如果有帮助,开发人员已使用 Java脚本在模糊事件中重新填充文本框。
编辑:我使用了显式等待元素可点击的条件。
使用 Java 脚本执行器应该可以。
JavascriptExecutor executor = (JavascriptExecutor) driver;
executor.executeScript("document.getElementById('CheckoutWelcomeTitle').value=''");
所需的元素是一个动态元素,因此要找到您必须诱导 WebDriverWait 的元素才能使 元素可点击 并且您可以使用以下任一项 :
cssSelector
:
WebElement myElement = new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.cssSelector("textarea.form-control.rd-control.rd-control--textarea.empty#CheckoutWelcomeTitle")));
myElement.click();
myElement.clear();
xpath
:
WebElement myElement = new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//textarea[@class='form-control rd-control rd-control--textarea empty' and @id='CheckoutWelcomeTitle']")));
myElement.click();
myElement.clear();
我认为值得一提的是无需自定义脚本即可工作的解决方案;考虑到驱动程序和 os 的所有 possible 排列,该问题的 most 最新解决方案是:
private fun clearField(element: WebElement) {
element.sendKeys(Keys.chord(Keys.SHIFT, Keys.ARROW_UP), Keys.DELETE)
element.sendKeys(Keys.chord(Keys.CONTROL, "a"), Keys.DELETE)
element.clear()
}
对于 clear 并不总是有效的事实,以及第一个适用于 mac 而第二个适用于 windows 的事实,这是一个非常多余的解决方案。
所有这三个组合也已经在带有验证和输入掩码的 React 应用程序上进行了测试。
要导入的命名空间是 import org.openqa.selenium.Keys
。
这是示例代码,为避免过时的元素,您不应传递 WebElements
。
我正在使用 Java 使用 Selenium WebDriver。 我有一个文本区域,我想清除默认内容并在其中输入新内容。功能是这样的,如果我从 textarea 中清除文本并点击 Tab 按钮,那么默认文本将自动填充。 下面是 textarea 的 HTML:
<textarea autocomplete="off" class="form-control rd-control rd-control--textarea empty" cols="20" data-bind="value: offerTitle, expandedTextArea: offerTitle, valueUpdate: 'afterkeydown', customerRequiredFieldsBinding" id="CheckoutWelcomeTitle" name="CheckoutWelcomeTitle" placeholder="ex. Here comes the best offer" rows="1" type="text" data-autosize-on="true" style="overflow-y: hidden; height: 35.9792px;" onblur="setTextColorDefault(this)" oninput="setTextColor(this)">Let's bid on a discount code!</textarea>
我尝试使用:
driver.findElement(By.id("CheckoutWelcomeTitle")).clear()
但这没有用。
我也试过这个:
driver.findElement(By.id("CheckoutWelcomeTitle")).sendKeys(Keys.CONTROL + "a")
driver.findElement(By.id("CheckoutWelcomeTitle")).sendKeys(Keys.DELETE)
这有时有效,但并非总是有效。有时它会清除数据并重新填充默认文本。
有没有其他方法可以每次都有效地清除此文本区域?
如果有帮助,开发人员已使用 Java脚本在模糊事件中重新填充文本框。
编辑:我使用了显式等待元素可点击的条件。
使用 Java 脚本执行器应该可以。
JavascriptExecutor executor = (JavascriptExecutor) driver;
executor.executeScript("document.getElementById('CheckoutWelcomeTitle').value=''");
所需的元素是一个动态元素,因此要找到您必须诱导 WebDriverWait 的元素才能使 元素可点击 并且您可以使用以下任一项
cssSelector
:WebElement myElement = new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.cssSelector("textarea.form-control.rd-control.rd-control--textarea.empty#CheckoutWelcomeTitle"))); myElement.click(); myElement.clear();
xpath
:WebElement myElement = new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//textarea[@class='form-control rd-control rd-control--textarea empty' and @id='CheckoutWelcomeTitle']"))); myElement.click(); myElement.clear();
我认为值得一提的是无需自定义脚本即可工作的解决方案;考虑到驱动程序和 os 的所有 possible 排列,该问题的 most 最新解决方案是:
private fun clearField(element: WebElement) {
element.sendKeys(Keys.chord(Keys.SHIFT, Keys.ARROW_UP), Keys.DELETE)
element.sendKeys(Keys.chord(Keys.CONTROL, "a"), Keys.DELETE)
element.clear()
}
对于 clear 并不总是有效的事实,以及第一个适用于 mac 而第二个适用于 windows 的事实,这是一个非常多余的解决方案。
所有这三个组合也已经在带有验证和输入掩码的 React 应用程序上进行了测试。
要导入的命名空间是 import org.openqa.selenium.Keys
。
这是示例代码,为避免过时的元素,您不应传递 WebElements
。