删除 Selenium WebDriver 中的只读属性
Posted
技术标签:
【中文标题】删除 Selenium WebDriver 中的只读属性【英文标题】:Remove readonly attributes in Selenium WebDriver 【发布时间】:2014-05-07 19:59:17 【问题描述】:我需要用 Java 中的 Selenium WebDriver 编辑一些 readonly
字段。由于 Selenium 甚至不让我找到这个字段,我搜索了解决方案,发现最简单的方法可能是使用带有 javascript Executor 的 JavaScript sn-p 删除 readonly
属性。
虽然这个 sn-p 在 Firefox 控制台中运行,成功地从所有输入中删除了该属性,但它在 Selenium 中引发了一个异常。
JavaScript 执行器:
((JavascriptExecutor) driver).executeScript(
"var inputs = document.getElementsByTagName('input');"+
"for(var i = 0; i < inputs.length; i++)"+
"inputs[i].removeAttribute('readonly','readonly');"
);
然后返回错误:
线程“主”org.openqa.selenium.WebDriverException 中的异常:非法字符
命令持续时间或超时:51 毫秒
更新:
如果我只留下第一个 JS 命令,也会出现同样的错误:
((JavascriptExecutor) driver).executeScript(
"var inputs = document.getElementsByTagName('input');");
堆栈跟踪的其余部分与此无关。任何人都知道如何解决此问题,或以其他方式编辑 readonly
字段?
【问题讨论】:
【参考方案1】:我无法找到您的代码的问题。但同时使用下面给出的代码。
List<WebElement> inputs = driver.findElements(By.tagName("input"));
for (WebElement input : inputs)
((JavascriptExecutor) driver).executeScript(
"arguments[0].removeAttribute('readonly','readonly')",input);
如果这对你有帮助,请告诉我。
【讨论】:
效果很好!我完全不确定它以前可能不起作用的原因,但毕竟我遇到了很多类似的问题,这些问题“应该”在 Selenium 中起作用,我不再感到惊讶......谢谢 没问题。我们会尝试找出您的代码有什么问题。 看我的回答 :) 一些字符(我认为它们只是 NULL 字符)被放置在你的字符串中。 我可以用 Ruby 解决这个问题吗?【参考方案2】:显然你的字符串中有一个非常时髦的字符。当我使用我的 和 -> 箭头键时,它被抓了三个字符在末尾和字符串的中间。似乎是一些复制意大利面的问题。
我已将其固定为一行,但我仍然建议使用@lost 的答案,因为它更明确。
@Config(url="https://rawgithub.com/ddavison/so-tests/master/22711441.html", browser= Browser.CHROME)
public class _22711441 extends AutomationTest
@Test
public void test()
((JavascriptExecutor) driver).executeScript(
// the issue was happening \/ here and \/ here
"var inputs = document.getElementsByTagName('input');for(var i = 0; i < inputs.length; i++)inputs[i].removeAttribute('readonly','readonly');"
);
setText(By.id("1"), "something")
.validateText(By.id("1"), "something");
查看脚本here和我用来测试的页面here
【讨论】:
谢谢!我在想它必须是这样的,但由于我正在使用 Firefox 控制台进行测试,没有任何错误,所以我无法找出问题所在。【参考方案3】:WebElement elementName = driver.findElement(By.xpath("//div[@arid='7']//input[@id='arid7']"));
((JavascriptExecutor) driver).executeScript("arguments[0].removeAttribute('readonly','readonly')", elementName);
这对我有用
【讨论】:
以上是关于删除 Selenium WebDriver 中的只读属性的主要内容,如果未能解决你的问题,请参考以下文章
我正在尝试使用selenium webdriver从Instagram中删除名称?
Selenium 中的 WebDriver 和 WebElement 有啥区别?
通过 Selenium 中的 webdriver 传递用户代理