Selenium:我可以在 Selenium 中设置 WebElement 的任何属性值吗?

Posted

技术标签:

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

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

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

【问题讨论】:

【参考方案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://***.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中使用上面的代码添加一个属性

【讨论】:

以上是关于Selenium:我可以在 Selenium 中设置 WebElement 的任何属性值吗?的主要内容,如果未能解决你的问题,请参考以下文章

Python Selenium在ubuntu中设置firefox配置文件的路径

如何在python selenium chrome webdriver中设置标头

如何在 Selenium Chromedriver 中设置时区?

如何在 Selenium WebDriver 中设置浏览器宽度和高度?

如何在 selenium Chrome 功能中设置默认下载目录?

如何在 Firefox 中设置 browser.helperApps.neverAsk.saveToDisk 以避免使用 Selenium 导出 Protonmail 电子邮件时弹出下载