【问题标题】:Remove readonly attributes in Selenium WebDriver删除 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 字段?

【问题讨论】:

    标签: java javascript firefox selenium selenium-webdriver


    【解决方案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);
    

    这对我有用

    【讨论】:

      猜你喜欢
      • 2014-08-20
      • 1970-01-01
      • 2011-01-19
      • 1970-01-01
      • 2011-12-16
      • 2011-01-30
      • 1970-01-01
      • 2014-09-30
      • 1970-01-01
      相关资源
      最近更新 更多