删除Selenium WebDriver中的只读属性

时间:2014-03-28 11:20:44

标签: java javascript firefox selenium selenium-webdriver

我需要使用Java中的Selenium WebDriver编辑一些readonly字段。由于Selenium不让我找到这些字段,我搜索了解决方案,发现最简单的方法是使用带有JavaScript Executor的JavaScript代码段移除readonly属性。

虽然此代码段可以在Firefox控制台上运行,但是从所有输入中成功删除了该属性,它会在Selenium中引发异常。

JavaScript执行者:

((JavascriptExecutor) driver).executeScript(
    "var inputs = document.getElementsByTagName('input');​​​​"+
    "for(var i = 0; i < inputs.length; i++)"+
        "inputs[i].removeAttribute('readonly','readonly');​​​​"
);

错误返回:

  

线程中的异常&#34; main&#34; org.openqa.selenium.WebDriverException:非法字符

     

命令持续时间或超时:51毫秒

更新

如果我只留下第一个JS命令,则会出现同样的错误:

((JavascriptExecutor) driver).executeScript(
    "var inputs = document.getElementsByTagName('input');​​​​");

堆栈跟踪的其余部分与此无关。任何人都知道如何解决这个问题,或者其他方式来编辑readonly字段?

3 个答案:

答案 0 :(得分:10)

我无法找到您的代码的问题。但在此期间请使用下面给出的代码。

List<WebElement> inputs = driver.findElements(By.tagName("input"));

for (WebElement input : inputs) {
    ((JavascriptExecutor) driver).executeScript(
                "arguments[0].removeAttribute('readonly','readonly')",input);
}

如果这有助于您,请告诉我。

答案 1 :(得分:2)

显然有一个非常时髦的角色被放入你的字符串..当我使用我的&lt; - - &gt; 箭头键时,它被抓住了最后三个字符,以及字符串的中间。似乎是一些复制面食问题。

我修好它只是把它放在一行,但是我仍然建议使用@ 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

的页面

答案 2 :(得分:0)

WebElement elementName = driver.findElement(By.xpath("//div[@arid='7']//input[@id='arid7']"));
((JavascriptExecutor) driver).executeScript("arguments[0].removeAttribute('readonly','readonly')", elementName);

这对我有用