Menggunakan Selenium Web Driver untuk mengambil nilai dari input HTML


122

Dalam HTML sebuah aplikasi web ada kode berikut

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

Apa yang sebenarnya ditampilkan di halaman itu adalah string yang menampilkan waktu.

Di Selenium Web Driver, saya memiliki WebElementobjek yang mengacu pada <input>penggunaan

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

Saya ingin mendapatkan nilai dari WebElement, atau, dengan kata lain, apa yang tercetak di halaman. Saya mencoba semua WebElementgetter dan tidak ada yang mengambil nilai sebenarnya yang dilihat pengguna. Ada bantuan? Terima kasih.

Jawaban:


212

Mencoba element.getAttribute("value")

The textproperti untuk teks dalam tag dari elemen. Untuk elemen input, teks yang ditampilkan tidak dibungkus oleh <input>tag, melainkan di dalam valueatribut.

Catatan: Kasus penting. Jika Anda menentukan "Nilai", Anda akan mendapatkan nilai 'null' kembali. Ini berlaku setidaknya untuk C #.


12
getAttribute("value")adalah benar-benar bagaimana Anda melakukan ini ?! Itu tidak masuk akal. Ada perbedaan besar antara valueatribut inputelemen dan valuepropertinya. Apakah Selenium melakukan hal mengerikan yang dilakukan jQuery dan menggabungkannya?
TJ Crowder

Itulah yang saya temui sekarang: mencoba mendapatkan nilai dari textarea, yang bukan merupakan atribut "nilai", atau pun teks antar-tag (ditetapkan secara dinamis sebagai atribut "nilai".
CF

2
Nah, ternyata jika atributnya hilang, ia akan mencoba mendapatkan properti yang sesuai. Jadi Anda dapat mengambil "nilai" dari textarea.
CF

Rupanya, ini adalah satu-satunya cara saya berhasil mengakses bidang formulir material
angulat

Bagi pengguna javascript jangan lupa awaitsaat menggunakan getAttribute.
Jeffrey Martinez

28

Anda bisa melakukan seperti ini:

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

ini akan memberi Anda waktu untuk menampilkan halaman web.


17

Dengan selenium 2,

saya biasanya menulisnya seperti itu:

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

ATAU

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


5

Mengikuti jawaban @ragzzy yang saya gunakan

 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;
        }
    }

Ia bekerja cukup baik dan tidak mengubah DOM


5

Seperti yang telah disebutkan sebelumnya, Anda dapat melakukan hal seperti itu

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

Tapi seperti yang Anda lihat, elemen Anda harus memiliki idatribut, dan juga, jquery di halaman Anda.


1

Jika nilai masukan diisi oleh skrip yang memiliki beberapa latensi yang terlibat (misalnya panggilan AJAX) maka Anda perlu menunggu sampai masukan telah diisi. Misalnya

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

elemen.GetAttribute ("nilai");

Meskipun jika Anda tidak melihat atribut "nilai" di html dom, Anda akan mendapatkan nilai bidang yang ditampilkan di GUI.


-1

Ini agak hacky, tetapi berhasil.

Saya menggunakan JavascriptExecutordan menambahkan a divke HTML, dan mengubah teks divmenjadi $('#prettyTime').val()Saya kemudian menggunakan Selenium untuk mengambil divdan mengambil nilainya. Setelah menguji kebenaran nilainya, saya menghapus div yang baru saja dibuat.


11
Ini seharusnya bukan jawaban yang diterima. Bahkan jika menggunakan JS, Anda bisa menjalankan dan mengembalikannya (daripada mengotak-atik DOM).
Matt Luongo
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.