Selenium 웹 드라이버를 사용하여 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, 즉 페이지에 인쇄 된 내용 을 얻고 싶습니다 . 나는 모든 WebElement게터를 시도했지만 사용자가 보는 실제 값을 검색하지 못했습니다. 도움이 필요하세요? 감사.

답변:


212

시험 element.getAttribute("value")

text속성은 요소의 태그 내의 텍스트입니다. 입력 요소의 경우 표시된 텍스트는 <input>태그로 래핑되지 않고 value속성 내부에 있습니다.

참고 : 케이스가 중요합니다. "Value"를 지정하면 'null'값이 반환됩니다. 이것은 적어도 C #의 경우에 해당됩니다.


12
getAttribute("value")입니다 정말 이 작업을 수행하는 방법?! 말이 안 돼. 요소 의 value속성과 속성 사이에는 큰 차이가 있습니다. Selenium은 jQuery가하는 끔찍한 일을하고 그것들을 융합합니까? inputvalue
TJ Crowder

이것이 내가 지금 부딪친 것입니다. "값"속성도 아니고 태그 사이의 텍스트도 아닌 텍스트 영역에서 값을 가져 오려고합니다 ( "값"속성으로 동적으로 설정 됨).
CF

2
글쎄, 속성이 누락되면 해당 속성을 얻으려고 시도합니다. 따라서 텍스트 영역에서 "값"을 가져올 수 있습니다.
CF

분명히, 이것은 내가 자료 양식 필드 angulat 액세스를 관리하는 유일한 방법입니다
Yennefer

자바 스크립트 사용자의 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 ( "값");

html dom에 "value"속성이 표시되지 않는 경우에도 GUI에 필드 값이 표시됩니다.


-1

이것은 일종의 해키이지만 작동합니다.

내가 사용 JavascriptExecutor하고 추가 divHTML로, 그리고 텍스트를 변경 div$('#prettyTime').val()다음을 검색하는 셀레늄을 사용 나는 div그 값을 잡아. 값의 정확성을 테스트 한 후 방금 생성 된 div를 제거했습니다.


11
This shouldn't be the accepted answer. Even if using JS, you can just execute and return that (instead of messing with the DOM).
Matt Luongo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.