删除 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 操作cookie

Selenium 中的 WebDriver 和 WebElement 有啥区别?

通过 Selenium 中的 webdriver 传递用户代理

selenium 中的 ChromeDriver 和 WebDriver 有啥区别?

selenium - webdriver - cookie操作