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.