각도기의 입력에서 텍스트를 얻는 방법


105

각도기 문서에서 다음 예를 참조하십시오.

describe('by model', function() {
  it('should find an element by text input model', function() {
    var username = element(by.model('username'));
    username.clear();
    username.sendKeys('Jane Doe');

    var name = element(by.binding('username'));

    expect(name.getText()).toEqual('Jane Doe');
  });

여기서 명확하게 보이는 것은 "by.model"을 사용하여 입력 상자에 값을 설정할 수 있다는 것입니다. 그러나 입력 상자를보고 그 안에 들어있는 내용을 보려면 "by.binding"을 사용해야합니다.

요약하면 다음과 같은 코드 세트가 있습니다.

element(by.model('risk.name')).sendKeys('A value');
expect(element(by.model('risk.name')).getText()).toEqual('A value');

(실제 코드에서 엔티티를 저장 한 다음 편집 모드로 돌아와서 제 값이 실제로 저장되었는지 확인하고 있습니다.하지만 여전히 똑같은 것으로 요약되며이 샘플 코드는 동일한 문제를 제공합니다).

이것은 나에게 오류를 준다.

Error: Expected '' to equal 'A value'.

이론적으로 문서의 예를 따르면 대신 다음을 수행 할 수 있습니다.

element(by.model('risk.name')).sendKeys('A value');
expect(element(by.binding('risk.name)).getText()).toEqual('A value');

그러나 by.binding은 정규화 된 모델을 좋아하지 않는 것 같습니다. 오류가 발생합니다.

Error: No element found using locator: by.binding("risk.name")

다음과 같이하면 작동합니다 (패션 이후).

element(by.model('risk.name')).sendKeys('A value');
expect(element(by.binding('name')).getText()).toEqual('A value');

이것은 요소를 찾지 만 'name'과 일치하는 요소가 두 개 이상 있다는 경고도 제공합니다. 그리고 불행히도 그것이 선택하는 것은 올바른 것이 아닙니다.

따라서 두 가지 질문이 있습니다.

  1. by.model이 getText ()를 반환 할 수 있어야합니까, 아니면 그렇게하지 않는 디자인 결정이 있고 대신 by.binding을 사용해야합니까?
  2. by.binding에서 정규화 된 엔터티를 사용할 수 있어야합니까? 아니면 by.binding이 전체 모델 이름을 좋아하지 않는다는 디자인 결정이 있습니까? 그렇다면 다른 바인딩 중에서 선택하는 데 사용할 수있는 다른 한정자는 무엇입니까?

편집하다:

나는 또한 vdrulerz가 제안한 솔루션을 시도했으며 다음과 같이 코드를 수정했습니다.

element(by.model('risk.name')).getText().then(function(text) {
  console.log(text);
  expect(text).toEqual('A risk name');  
});

console.log가 빈 값 (프로 미스 또는 객체가 아님)을 반환하고 예상이 실패하여 메시지를 표시합니다.

Expected '' to equal 'A risk name'.

내 이해는 각도기가 이미 약속을 처리 할 것으로 예상되는 패치를 패치했기 때문에 근본적인 문제는 모델을 통해 식별 된 필드에서 작동하지 않는 getText라고 생각합니다 (라벨 및 기타 위젯에서 성공적으로 getText를 얻을 수 있음).

getText () 대신 getAttribute를 사용하여 다음 코드를 실행할 수도 있습니다.

expect(element(by.model('risk.name')).getAttribute('autofocus')).toEqual('true');
element(by.model('risk.name')).getAttribute('autofocus').then(function(text) {
  console.log(text);
  expect(text).toEqual('true');  
});

첫 번째 부분은 통과합니다. 두 번째 부분도 작동하여 vdrulerz '구문도 유효하며 콘솔에'true '를 기록합니다. getText에 잠재적으로 결함이 있다고 생각합니까?

답변:


202

이것은 각도기 FAQ : https://github.com/angular/protractor/blob/master/docs/faq.md#the-result-of-gettext-from-an-input-element-is-always-에서 답변됩니다.

입력 요소의 getText 결과는 항상 비어 있습니다.

이것은 웹 드라이버의 특성입니다. 요소에는 항상 빈 getText 값이 있습니다. 대신 다음을 시도하십시오.

element.getAttribute('value')

질문 2의 경우, 예, by.binding에 정규화 된 이름을 사용할 수 있어야합니다. 템플릿에 실제로 {{}} 또는 ng-bind를 통해 risk.name에 바인딩 된 요소가없는 것 같습니다.


아, 나는 그것을 검색하는 것을 포함하여 모든 곳을 보았다고 생각했다. 그리고 나는 답을 찾지 못했다는 것을 기초로 오늘 각도기 github에서 이것을 문제로 제기했습니다. 귀찮음. 내 요소는 ng-model에 바인딩되어 있으므로 html에 "ng-model ="risk.name ""이 있습니다. 그러나 그것이 작동하는 데 필요한 것이 아닐 수도 있습니다. getAttribute 사용을 제안하도록 doco를 업데이트하는 것이 좋습니다.
PaulL

1
내가 이것을 알아내는 데 너무 오래 걸렸기 때문에 후손을 위해 이것을 추가하십시오 : getAttribute는 실제로 문자열이 아닌 약속을 반환합니다. github.com/angular/protractor/issues/673
boredlamer

그리고이 마법은 실제로 속성을 가져 오는 getAttribute의 동작 때문에 작동한다고 생각합니다 (즉, DOM에 "value"속성이없는 경우에도 값을 반환합니다) : "..., 해당 속성이 그렇지 않은 경우 존재하는 경우, 동일한 이름의 속성 값이 "리턴
레드 완두콩

6

getText() 함수는 웹 드라이버에서 사용하던 방식처럼 작동하지 않을 것입니다. 각도기에서 작동하게하려면 함수로 감싸고 각도기 프레임 워크에서했던 것과 같은 텍스트를 반환해야합니다. 다음과 같은 일반적인 기능-

getText : function(element, callback) {
        element.getText().then (function(text){             
            callback(text);
         });        

    },

이것으로 요소의 텍스트를 가질 수 있습니다.

그래도 불분명하면 알려주세요.


텍스트를 직접 사용하려면 그렇게해야한다는 것을 이해합니다.하지만 Protractor가 Jasmine을 패치했다고 생각했습니다. matcher가 약속을 처리 할 것으로 예상했기 때문에 expect (element.getText ()). toEqual이 요소와 사실상 동일했습니다. .getText (). then (expect (text) .toEqual). 맞지 않습니까?
PaulL

이것은 또한 나를 위해 작동하지 않습니다. 이 형식을 볼 수 있도록 위의 질문을 확장했습니다.
PaulL

element (by.locator ( 'abc'). getText (). then (function (text) {console.log (text) expect (text) .toEqual ( "sometext");});
vdrulerz 사용 시도

Object [object Object]에 'locator'메소드가 없다고보고합니다. 나는 'by.locator'의 각도기 API에서 메소드를 볼 수 없으며 코드에서도 하나를 볼 수 없습니다. 확실히 by.locator 메소드가 있다면 'by.locator'와 같은 것입니다. locator ( 'model', 'risk.name') '?
PaulL

by.locator를 사용하면 prot.findelement (By.id), CSS, Xpath 또는 모든 로케이터 속성과 같은 것을 사용할 수 있음을 의미합니다 .... 그래도 작동하지 않는 경우 plz는 코드 및 html 속성을 나와 공유합니다. 당신을 도와 ...
vdrulerz

2

나는이 문제가 있었지만 Jmr의 솔루션을 시도했지만 나를 위해 작동하지 않았습니다. 모든 입력 필드에 ng-model 속성이 있으므로 속성을 가져와 평가하고 값을 얻을 수 있습니다.

HTML

<input ng-model="qty" type="number">

길게 끄는 것

var qty = element( by.model('qty') );
qty.sendKeys('10');
qty.evaluate(qty.getAttribute('ng-model')) //-> 10

0

이 코드는 작동합니다. 사용자가 달력에서 선택하도록 강제하는 읽기 전용으로 설정된 날짜 입력 필드가 있습니다.

시작일 :

var updateInput = "var input = document.getElementById('startDateInput');" +
    "input.value = '18-Jan-2016';" +
    "angular.element(input).scope().$apply(function(s) { s.$parent..searchForm[input.name].$setViewValue(input.value);})";
browser.executeScript(updateInput);

종료일 :

var updateInput = "var input = document.getElementById('endDateInput');" +
    "input.value = '22-Jan-2016';" +
    "angular.element(input).scope().$apply(function(s) { s.$parent.searchForm[input.name].$setViewValue(input.value);})";
    browser.executeScript(updateInput);

0

아래 코드는 입력에서 텍스트를 얻기 위해 나를 위해 작동합니다.

return(this.webelement.getAttribute('value').then(function(text)
    {
        console.log("--------" + text);
}))

0

Promise를 사용하여 요소의 값을 인쇄하거나 저장해야합니다.

 var ExpectedValue:string ="AllTestings.com";
          element(by.id("xyz")).getAttribute("value").then(function (Text) {

                        expect(Text.trim()).toEqual("ExpectedValue", "Wrong page navigated");//Assertion
        console.log("Text");//Print here in Console

                    });

-1

이런 식으로 시도해 볼 수 있습니다.

var access_token = driver.findElement(webdriver.By.name("AccToken"))

        var access_token_getTextFunction = function() {
            access_token.getText().then(function(value) {
                console.log(value);
                return value;
            });
        }

값을 얻고 자하는 곳에이 함수를 호출 할 수 있습니다.


-3

jQuery를 사용하여 텍스트 상자에 텍스트를 가져오고 (잘 작동 함) 이미지 세부 정보를 확인할 수 있습니다.

암호:

$(document.evaluate( "xpath" ,document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null ).singleNodeValue).val()

Example: 
$(document.evaluate( "//*[@id='mail']" ,document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null ).singleNodeValue).val()

위의 쿼리를 코드에 삽입하십시오. 이미지 세부 사항 :

여기에 이미지 설명 입력

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.