Bir HTML girdisinin değerini almak için Selenium Web Sürücüsünü kullanma


122

Bir web uygulamasının HTML'sinde aşağıdaki kod bulunur

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

Sayfada gerçekte gösterilen, saati gösteren bir dizedir.

Selenyum Web Sürücü, ben bir var WebElementnesne atıfta <input>kullanarak

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

Ben WebElement, ya da başka bir deyişle, sayfada neyin yazdırıldığını öğrenmek istiyorum . Tüm WebElementalıcıları denedim ve hiçbir şey kullanıcının gördüğü gerçek değeri alamadı. Herhangi bir yardım? Teşekkürler.

Yanıtlar:


212

Deneyin element.getAttribute("value")

textNitelik bir elemanın etiketleri içinde metnin içindir. Giriş öğeleri için, görüntülenen metin <input>etiketle sarmalanmaz , bunun yerine valueniteliğin içindedir .

Not: Durum önemlidir. "Değer" belirtirseniz, "boş" bir değer geri alırsınız. Bu en azından C # için geçerlidir.


12
getAttribute("value")olduğu gerçekten bunu nasıl ?! Bu hiç mantıklı değil. valueBir inputöğenin niteliği ile özelliği arasında büyük bir fark vardır value. Selenium, jQuery'nin yaptığı korkunç şeyi yapıyor ve onları karıştırıyor mu?
TJ Crowder

Şu anda karşılaştığım şey buydu: ne bir "değer" özniteliği ne de bir etiket arası metin (dinamik olarak "değer" özniteliği olarak ayarlanan metin alanından bir değer almaya çalışmak.
CF

2
Peki, eğer öznitelik eksikse, karşılık gelen özelliği almaya çalışacağı ortaya çıkıyor. Böylece bir metin alanından bir "değer" alabilirsiniz.
CF

Anlaşılan, angulat materyal form alanlarına erişebilmemin tek yolu bu
Yennefer

Javascript kullanıcıları için await, kullanırken unutmayın getAttribute.
Jeffrey Martinez

28

Bunu beğenebilirsin:

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

bu size web sayfasında görüntülenen zamanı verecektir.


17

Selenyum 2 ile,

genellikle şöyle yazarım:

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

VEYA

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

10

Python bağlamaları için şöyle olacaktır:

element.get_attribute('value')

5

@Ragzzy'nin cevabını takiben kullandım

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

Oldukça iyi çalışıyor ve DOM'u değiştirmiyor


5

Daha önce de belirtildiği gibi, böyle bir şey yapabilirsiniz

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

Ancak gördüğünüz gibi, öğenizin bir idözniteliği ve ayrıca sayfanızda jquery olması gerekir.


1

Giriş değeri, biraz gecikme içeren bir komut dosyası tarafından doldurulursa (örn. AJAX çağrısı), girişin doldurulmasını beklemeniz gerekir. Örneğin

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 ( "değeri");

Html dom'da "değer" özniteliğini görmeseniz bile, GUI'de görüntülenen alan değerini alırsınız.


-1

Bu biraz zor ama işe yarıyor.

HTML'ye JavascriptExecutora kullandım ve ekledim divve içindeki metni değiştirdim div. $('#prettyTime').val()Daha sonra Selenium'u almak divve değerini almak için kullandım . Değerin doğruluğunu test ettikten sonra, yeni oluşturulan div'i kaldırdım.


11
Kabul edilen cevap bu olmamalı. JS kullanıyor olsanız bile, bunu çalıştırabilir ve geri verebilirsiniz (DOM ile uğraşmak yerine).
Matt Luongo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.