การใช้ Selenium Web Driver เพื่อดึงค่าของอินพุต HTML


122

ใน HTML ของเว็บแอปมีรหัสต่อไปนี้

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

สิ่งที่แสดงบนหน้านี้คือสตริงที่แสดงเวลา

ใน Selenium Web Driver ฉันมีWebElementวัตถุที่อ้างถึงการ<input>ใช้

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

ฉันต้องการรับค่าของWebElementหรือกล่าวอีกนัยหนึ่งคือสิ่งที่พิมพ์บนหน้า ฉันลองใช้WebElementgetters ทั้งหมดแล้วและยังไม่มีการดึงค่าจริงที่ผู้ใช้เห็น ความช่วยเหลือใด ๆ ขอบคุณ

คำตอบ:


212

ลอง element.getAttribute("value")

textคุณสมบัติสำหรับข้อความภายในแท็กของธาตุนั้น สำหรับองค์ประกอบการป้อนข้อความที่แสดงจะไม่ถูกรวมไว้ด้วย<input>แท็ก แต่จะอยู่ภายในvalueแอตทริบิวต์

หมายเหตุ: กรณีสำคัญ หากคุณระบุ "ค่า" คุณจะได้รับค่า "null" กลับคืนมา นี่เป็นจริงสำหรับ C # อย่างน้อย


12
getAttribute("value")คือจริงๆวิธีที่คุณทำเช่นนี้ ?! นั่นไม่สมเหตุสมผลเลย มีความแตกต่างอย่างมากระหว่างvalueแอตทริบิวต์ของinputองค์ประกอบและvalueคุณสมบัติของมัน ซีลีเนียมทำสิ่งที่น่าสยดสยองที่ jQuery ทำและทำให้พวกเขาสับสนหรือไม่?
TJ Crowder

นั่นคือสิ่งที่ฉันพบในตอนนี้: พยายามหาค่าจาก textarea ซึ่งไม่ใช่แอตทริบิวต์ "value" หรือระหว่างแท็ก (ตั้งค่าแบบไดนามิกเป็นแอตทริบิวต์ "value"
CF

2
ปรากฎว่าถ้าแอตทริบิวต์หายไปก็จะพยายามรับคุณสมบัติที่เกี่ยวข้อง ดังนั้นคุณสามารถใช้ "ค่า" จากพื้นที่ข้อความ
CF

เห็นได้ชัดว่านี่เป็นวิธีเดียวที่ฉันจัดการเพื่อเข้าถึงช่องแบบฟอร์มวัสดุ
angulat

สำหรับผู้ใช้ javascript อย่าลืมawaitเมื่อใช้getAttributeไฟล์.
Jeffrey Martinez

28

คุณสามารถทำได้ดังนี้:

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

ซึ่งจะทำให้คุณมีเวลาที่แสดงบนหน้าเว็บ


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 แต่คุณจะได้รับค่าฟิลด์ที่แสดงบน GUI


-1

นี่เป็นประเภทแฮ็ก แต่ได้ผล

ผมใช้JavascriptExecutorและเพิ่มdivเป็น HTML และการเปลี่ยนแปลงข้อความในส่วนdivที่จะ$('#prettyTime').val()ฉันแล้วใช้ซีลีเนียมเพื่อดึงdivและคว้าความคุ้มค่า หลังจากทดสอบความถูกต้องของค่าฉันลบ div ที่เพิ่งสร้างขึ้น


11
นี่ไม่ควรเป็นคำตอบที่ยอมรับได้ แม้ว่าจะใช้ JS คุณก็สามารถดำเนินการและส่งคืนข้อมูลนั้นได้ (แทนที่จะไปยุ่งกับ DOM)
Matt Luongo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.