【问题标题】:Selenium: Can I set any of the attribute value of a WebElement in Selenium?Selenium:我可以在 Selenium 中设置 WebElement 的任何属性值吗?
【发布时间】:2012-01-18 08:53:50
【问题描述】:

我有一个 WebElement,我想将其属性值重置为其他值(例如,attr 是属性,我想将其原始 value=1 更改为新的 value=10)。

有可能吗?我正在使用 Selenium 2.0 (WebDriver.)

【问题讨论】:

    标签: testing selenium


    【解决方案1】:

    您必须使用 JavascriptExecutor 类:

    WebDriver driver; // Assigned elsewhere
    JavascriptExecutor js = (JavascriptExecutor) driver;
    js.executeScript("document.getElementById('//id of element').setAttribute('attr', '10')");
    

    【讨论】:

    • 您好,感谢您的回复,但在 Sel2.0 中我们无法获取文档对象引用。我们必须通过 WebDriver 获取元素,它返回不支持属性设置的“WebElement”。 driver.findElement(By.id("元素的id'))
    • @yami 在 Selenium 2 中,您可以执行支持访问 DOM 的 javascript。就像在网站上运行相同的代码一样。您只是不使用 WebElement 类,而是使用 JavascriptExecutor 类并使用 WebDriver 进行转换。
    • 没错。我再次验证,我们可以得到完整的 DOM 引用并对其进行操作。然而,一旦我们将 JS 脚本作为字符串传递给 executeScript,调试就会变得很困难。虽然我觉得如果它可以通过 WebElement 并且它应该为我们提供 DOM 的完整功能,那么它会很棒。但是,无论这个答案对我有多大帮助..:-)到目前为止,我都可以接受。谢谢..!!
    • 快速问题:有没有办法在 web 元素的上下文中执行 javascript?换句话说:有一个WebElement(例如:一个没有其他属性的简单<span>)有办法执行javascript并以某种方式传递对这个js元素的引用。 (也许 js 中的this 会引用它?)
    • 找到答案:将WebElement(s) 传递给执行者并在脚本中访问arguments[0]([1,2...])
    【解决方案2】:

    如果您正在使用PageFactory 模式或已经引用了您的WebElement,那么您可能希望使用对WebElement 的现有引用来设置属性。 (而不是在你的 javascript 中使用document.getElementById(...)

    以下示例允许您使用现有的 WebElement 参考设置属性。

    代码片段

    import org.openqa.selenium.WebElement;
    import org.openqa.selenium.remote.RemoteWebDriver;
    import org.openqa.selenium.support.FindBy;
    
    public class QuickTest {
    
        RemoteWebDriver driver;
    
        @FindBy(id = "foo")
        private WebElement username;
    
        public void exampleUsage(RemoteWebDriver driver) {
            setAttribute(username, "attr", "10");
            setAttribute(username, "value", "bar");
        }
    
        public void setAttribute(WebElement element, String attName, String attValue) {
            driver.executeScript("arguments[0].setAttribute(arguments[1], arguments[2]);", 
                    element, attName, attValue);
        }
    }
    

    【讨论】:

    • 我使用这种方法。它在 firefox v30 和 google chrome 和 IE 上成功,但在 firefox v35 上失败,它说 arguments[0] 是未定义的,尽管我已经等到这个元素存在了。
    • 多次使用此方法与执行设置所有需要属性的单个脚本相比,性能如何? executeScript 方法的开销是不是很大?
    • @mrog,我没有性能指标...(这是大约 3 年前)。还有,你拿什么来比较?它需要一个 var arg 参数数组,所以如果你想要“一个”调用,你可以同时设置多个属性......例如driver.executeScript("arguments[0].setAttribute(arguments[1], arguments[2]);arguments[0].setAttribute(arguments[3], arguments[4]);", element, att1Name, att1Value, att2Name, att2Value);
    【解决方案3】:

    基于先前答案的花哨 C# 扩展方法:

    public static IWebElement SetAttribute(this IWebElement element, string name, string value)
    {
        var driver = ((IWrapsDriver)element).WrappedDriver;
        var jsExecutor = (IJavaScriptExecutor)driver;
        jsExecutor.ExecuteScript("arguments[0].setAttribute(arguments[1], arguments[2]);", element, name, value);
    
        return element;
    }
    

    用法:

    driver.FindElement(By.Id("some_option")).SetAttribute("selected", "selected");
    

    【讨论】:

      【解决方案4】:

      另一个回答这个问题的人可以在这里找到@nilesh https://stackoverflow.com/a/19934852/2079692

      public void setAttributeValue(WebElement elem, String value){
          JavascriptExecutor js = (JavascriptExecutor) driver;
          js.executeScript("arguments[0].setAttribute(arguments[1],arguments[2])",
              elem, "value", value
          );
      }
      

      这利用了 selenium findElementBy 函数,其中 xpath 也可以使用。

      【讨论】:

      • IMO“值”是属性而不是属性。 '(arguments[0])[arguments[1]] = arguments[2]' 将适用于 value
      【解决方案5】:

      我创建了这个 jquery 来解决我的问题。

      public void ChangeClassIntoSelected(String name,String div) {
              JavascriptExecutor js = (JavascriptExecutor) driver;
              js.executeScript("Array.from($(\"div." + div +" ul[name=" + name + "]\")[0].children).forEach((element, index) => {\n" +
                      "   $(element).addClass('ui-selected');\n" +
                      "});");
          }
      

      使用此脚本,您可以将实际的类名更改为其他名称。

      【讨论】:

      • 欢迎来到 SO。请格式化您的代码并解释解决方案。在这里,仅仅提供解决方案是不够的。
      【解决方案6】:

      我已经针对同样的问题发布了类似的解决方案,

      访问How to use javascript to set attribute of selected web element using selenium Webdriver using java?

      这里首先我们在我的例子中找到了元素我使用 xpath 找到了元素然后我们遍历元素列表然后我们将驱动程序对象转换为 Executor 对象并在这里创建一个脚本第一个参数是元素和第二个参数是属性,第三个参数是新值

      List<WebElement> unselectableDiv = driver
                      .findElements(By.xpath("//div[@class='x-grid3-cell-inner x-grid3-col-6']"));
      
              for (WebElement element : unselectableDiv) {
      
                  // System.out.println( "**** Checking the size of div "+unselectableDiv.size());
      
                  JavascriptExecutor js = (JavascriptExecutor) driver;
      
                  String scriptSetAttr = "arguments[0].setAttribute(arguments[1],arguments[2])";
      
                  js.executeScript(scriptSetAttr, element, "unselectable", "off");
      
                  System.out.println(" *****   check value of Div property " + element.getAttribute("unselectable"));
      
              }
      

      【讨论】:

        【解决方案7】:
            JavascriptExecutor js = (JavascriptExecutor) driver;        
            js.executeScript("document.getElementsByClassName('featured-heading')[0].setAttribute('style', 'background-color: green')");
        

        我可以在java中使用上面的代码添加一个属性

        【讨论】:

          猜你喜欢
          • 2021-08-17
          • 2015-05-02
          • 2016-02-11
          • 1970-01-01
          • 2016-07-28
          • 1970-01-01
          • 2020-11-18
          • 2015-10-18
          • 2017-04-28
          相关资源
          最近更新 更多