Selenium Web Driverを使用してHTML入力の値を取得する


122

WebアプリケーションのHTMLには次のコードがあります

<input type="text" name="prettyTime" id="prettyTime" class="ui-state-disabled prettyTime"  readonly="readonly">

実際にページに表示されるのは、時間を表示する文字列です。

セレンのWebドライバでは、私が持っているWebElementオブジェクトが参照して<input>使用して

WebElement timeStamp = waitForElement(By.id("prettyTime"));

の値、WebElementつまり、ページに印刷されている値を取得したい。私はすべてのWebElementゲッターを試しましたが、ユーザーに表示される実際の値を取得するものは何もありませんでした。何か助け?ありがとう。

回答:


211

試す element.getAttribute("value")

textプロパティは、要素のタグ内のテキストのためです。入力要素の場合、表示されるテキストは<input>タグでラップされず、value属性内にあります。

注:大文字と小文字が区別されます。「値」を指定すると、「null」値が返されます。これは少なくともC#に当てはまります。


12
getAttribute("value")ある本当にあなたがこれを行う方法!それは意味がありません。要素のvalue属性inputとそのvalueプロパティには大きな違いがあります。SeleniumはjQueryが行う恐ろしいことを行い、それらを融合させますか?
TJクラウダー2016

それは私が今にぶつかってきたものだ:「値」属性、もの間、タグのテキスト(動的「値」属性としてセットでもないテキストエリアから値を取得しようとしている。
CF

2
さて、属性がない場合、対応するプロパティを取得しようとすることがわかりました。したがって、textareaから「値」を取得できます。
CF

どうやら、これは私がなんとかしてアングラマテリアルフォームフィールドにアクセスする唯一の方法です
Yennefer

JavaScriptユーザーのawait場合は、を使用するときに忘れないでくださいgetAttribute
ジェフリーマルティネス

27

あなたはこのようにすることができます:

webelement time=driver.findElement(By.id("input_name")).getAttribute("value");

これにより、Webページに表示される時間がわかります。


17

セレン2で、

私は通常そのように書きます:

WebElement element = driver.findElement(By.id("input_name"));
String elementval = element.getAttribute("value");

または

String elementval = driver.findElement(By.id("input_name")).getAttribute("value");


5

私が使用する@ragzzyの回答に続いて

 public static string Value(this IWebElement element, IJavaScriptExecutor javaScriptExecutor)
    {

        try
        {
            string value = javaScriptExecutor.ExecuteScript("return arguments[0].value", element) as string;
            return value;
        }
        catch (Exception)
        {
            return null;
        }
    }

それは非常にうまく機能し、DOMを変更しません


5

前に述べたように、あなたはそのようなことをすることができます

public String getVal(WebElement webElement) {
    JavascriptExecutor e = (JavascriptExecutor) driver;
    return (String) e.executeScript(String.format("return $('#%s').val();", webElement.getAttribute("id")));
}

しかしid、ご覧のとおり、要素には属性が必要です。また、ページにjquery が必要です。


1

待ち時間が含まれるスクリプト(AJAX呼び出しなど)によって入力値が入力される場合は、入力が入力されるまで待機する必要があります。例えば

var w = new WebDriverWait(WebBrowser, TimeSpan.FromSeconds(10));
            w.Until((d) => {
                // Wait until the input has a value...

                var elements = d.FindElements(By.Name(name));

                var ele = elements.SingleOrDefault();

                if (ele != null)
                {
                    // Found a single element

                    if (ele.GetAttribute("value") != "")
                    {
                        // We have a value now
                        return true;
                    }
                }

                return false;
                });

        var e = WebBrowser.Current.FindElement(By.Name(name));

        if (e.GetAttribute("value") != value)
        {
            Assert.Fail("Result contains a field named '{0}', but its value is '{1}', not '{2}' as expected", name, e.GetAttribute("value"), value);
        }

0

element.GetAttribute( "value");

ただし、html domに「value」属性が表示されない場合は、GUIにフィールド値が表示されます。


-1

これは一種のハックですが、動作します。

私が使用JavascriptExecutorして、コメントを追加divHTMLに、そしてテキストを変更divする$('#prettyTime').val()私はその後、取得するために、セレンを使用divし、その値をつかみます。値の正当性をテストした後、作成したdivを削除しました。


11
これは受け入れられる答えではありません。JSを使用している場合でも、(DOMをいじる代わりに)実行して返すことができます。
Matt Luongo 2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.