web-dev-qa-db-ja.com

Selenium:SeleniumでWebElementの属性値を設定できますか?

WebElementがあり、その属性の値を他の値にリセットしたい(たとえば、attrは属性であり、元のvalue=1 to new value=10)。

出来ますか? Selenium 2.0(WebDriver)を使用しています

44
yami

JavascriptExecutorクラスを使用する必要があります。

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

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);
    }
}
16
Nick Grealy

以前の回答に基づいた派手な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");
10

ここで利用可能なこの質問に答える別の回答者 @ nileshhttps://stackoverflow.com/a/19934852/2079692

    public void setAttributeValue(WebElement elem, String value){
    js = (JavascriptExecutor) webDriver; 

    String scriptSetAttrValue = "arguments[0].setAttribute(arguments[1],arguments[2])";

    js.executeScript(scriptSetAttrValue, elem, "value", value);

}

これは、xpathも使用できるSelenium findElementBy関数を利用します。

2
Anudeep Samaiya

私はこの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" +
                "});");
    }

このスクリプトを使用すると、実際のクラス名を他の名前に変更できます。

0
Darío Spasaro