Sử dụng Trình điều khiển web Selenium để truy xuất giá trị của đầu vào HTML


122

Trong HTML của ứng dụng web có đoạn mã sau

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

Những gì thực sự được hiển thị trên trang là một chuỗi hiển thị thời gian.

Trong Selenium Web Driver, tôi có một WebElementđối tượng đề cập đến việc <input>sử dụng

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

Tôi muốn lấy giá trị của WebElement, hay nói cách khác, những gì được in trên trang. Tôi đã thử tất cả các WebElementgetters và không có gì đang truy xuất giá trị thực tế mà người dùng nhìn thấy. Bất kỳ giúp đỡ? Cảm ơn.

Câu trả lời:


212

Thử element.getAttribute("value")

Các textbất động sản là nội dung bên trong các thẻ của một phần tử. Đối với các phần tử đầu vào, văn bản được hiển thị không được bao bọc bởi <input>thẻ, thay vào đó nó nằm bên trong valuethuộc tính.

Lưu ý: Vấn đề trường hợp. Nếu bạn chỉ định "Giá trị", bạn sẽ nhận lại giá trị 'null'. Điều này ít nhất cũng đúng với C #.


12
getAttribute("value")thực sự là cách bạn làm điều này?! Điều đó không có ý nghĩa gì. Có một sự khác biệt lớn giữa valuethuộc tính của một inputphần tử và thuộc tính của nó value. Liệu Selenium có làm được điều khủng khiếp mà jQuery làm và làm chúng bị rối loạn?
TJ Crowder

Đó là những gì tôi đã gặp ngay bây giờ: cố gắng lấy một giá trị từ một vùng văn bản, không phải là thuộc tính "giá trị", cũng không phải là văn bản giữa thẻ (đặt động làm thuộc tính "giá trị".
CF

2
À, hóa ra nếu thiếu thuộc tính, nó sẽ cố gắng lấy thuộc tính tương ứng. Vì vậy, bạn có thể lấy một "giá trị" từ một vùng văn bản.
CF

Rõ ràng, đây là cách duy nhất tôi cố gắng truy cập angulat lĩnh vực hình thức vật chất
Yennefer

Đối với người dùng javascript, đừng quên awaitkhi sử dụng getAttribute.
Jeffrey Martinez

28

Bạn có thể làm như sau:

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

điều này sẽ cung cấp cho bạn thời gian hiển thị trên trang web.


17

Với selen 2,

tôi thường viết nó như thế:

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

HOẶC LÀ

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


5

Tôi sử dụng câu trả lời sau của @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;
        }
    }

Nó hoạt động khá tốt và không làm thay đổi DOM


5

Như đã đề cập trước đây, bạn có thể làm điều gì đó như thế

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

Nhưng như bạn có thể thấy, phần tử của bạn phải có một idthuộc tính và cả jquery trên trang của bạn.


1

Nếu giá trị đầu vào được điền bởi một tập lệnh có liên quan đến độ trễ (ví dụ: lệnh gọi AJAX) thì bạn cần phải đợi cho đến khi đầu vào đã được điền. Ví dụ

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 ("giá trị");

Mặc dù nếu bạn không thấy thuộc tính "value" trong html dom, bạn sẽ nhận được giá trị trường được hiển thị trên GUI.


-1

Đây là một loại hacky, nhưng nó hoạt động.

Tôi đã sử dụng JavascriptExecutorvà thêm a divvào HTML, và thay đổi văn bản divthành $('#prettyTime').val()sau đó tôi sử dụng Selenium để truy xuất divvà lấy giá trị của nó. Sau khi kiểm tra tính đúng đắn của giá trị, tôi đã xóa div vừa tạo.


11
Đây không phải là câu trả lời được chấp nhận. Ngay cả khi sử dụng JS, bạn chỉ có thể thực thi và trả về nó (thay vì gây rối với DOM).
Matt Luongo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.