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.

jamesfzhang
sumber

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 #.

prestomanifesto
sumber
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.

Praveen
sumber
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");
e1che
sumber
9

Untuk pengikatan python, itu akan menjadi:

element.get_attribute('value')
Sajid Manzoor
sumber
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

Vfleitao
sumber
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.

raggzy
sumber
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);
        }
layar
sumber
0

elemen.GetAttribute ("nilai");

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

Rajesh
sumber
-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.

jamesfzhang
sumber
11
Ini seharusnya bukan jawaban yang diterima. Bahkan jika menggunakan JS, Anda bisa menjalankan dan mengembalikannya (daripada mengotak-atik DOM).
Matt Luongo