programing

요소가 존재하는지 여부에 대한 조건을 영사기에 작성하는 방법

telecom 2023. 2. 24. 13:15
반응형

요소가 존재하는지 여부에 대한 조건을 영사기에 작성하는 방법

저는 프로젝터 JS를 사용하고 있습니다.그리고 이 사이트는 Angular JS로 되어 있습니다.

토글 스위치가 있어요스위치를 끄거나 켜면 토글스위치의 값이 true에서 false로, false에서 true로 바뀝니다.

프로젝터가 페이지를 방문했을 때 전환 스위치가 'OFF'로 되어 있으면 'ON'으로 되어 있는 상태를 만들려고 합니다.토글 스위치가 이미 'ON' 상태이면 먼저 스위치를 'OFF'한 다음 다시 'ON' 상태로 전환합니다.

이 코드를 생각해 냈는데, 어떤 이유로 동작하지 않습니다.

 if( expect(element(By.id('toggle-switch')).element(By.css('[value="false"]')).isDisplayed()) ) {
            element(By.id('toggle-switch')).click();
            console.log('in the if')
       }

       else{
           element(By.id('toggle-switch')).click();
           browser.sleep(3000);
           element(By.id('toggle-switch')).click();
           console.log('in the else')
       }

이 코드는 if 문에 대해서만 기능하는 것으로 보입니다.어떤 이유에서인지 그것은 절대 다른 곳으로 가지 않을 것이다.다음은 오류입니다.

NoSchElementError:로케이터를 사용하여 요소를 찾을 수 없습니다: By.cssSelector("[value=\"false\"]")

그래서 나는 시도했다.

.isPresent()대신.isDisplayed()위의 에러는 수신되지 않습니다만, 어떠한 이유로 .isPresent()를 사용하면, 항상 if 스테이트먼트로 이동해, 그것만을 실행하고, 그 이외의 스테이트먼트를 실행하지 않습니다.에러는 표시되지 않는다.

더 좋은 방법이 있으면 알려주세요.이 프레임워크에서 적절한 조건을 만들 수 없는 것은 매우 제한적인 것으로 보입니다.

그 것을 기억하라.isDisplayed()는 약속을 반환합니다.사용할 수 있는 항목은 다음과 같습니다.

element(anyFinder).isDisplayed().then(function(result) {
    if ( result ) {
        //Whatever if it is true (displayed)
    } else {
        //Whatever if it is false (not displayed)
    }
});

isDisplayed()효과가 없었습니다.API가 변경되었을 수 있습니다. isPresent()이 솔루션은 다음과 같습니다.

    var logoutButton =  element(by.css('[ng-click="log_out()"]'));
    logoutButton.isPresent().then(function(result) {
    if ( result ) {
        logoutButton.click();
    } else {
        //do nothing
    }
    });

문제는 WebDriverJS/Protractor의 많은 메서드처럼 이러한 문제를 디버깅하기 어렵게 하는 정의상 "구질적"인 약속 반환한다는 것입니다.

예시를 통해 더 잘 이해할 수 있도록 해 봅시다.

다음과 같은 코드가 있다고 가정해 보십시오. 언뜻 보기에는 문제가 없을 수 있습니다.

var elm = $("#myid");
if (elm.isDisplayed()) {
    // do smth
} else {
    // do smth else
}

이제, 그것은 심각한 문제를 가지고 있다.do smth else 부품에 도달하지 못할 이다.elm.isDisplayed()부울값이 아니라 약속입니다.이 요소가 표시되지 않더라도,// do smth부품이 실행되었습니다.

대신 값을 확인해야 할 경우isDisplayed()조건식 내에서 사용하려면 다음과 같이 명시적으로 약속을 해결해야 합니다.

var elm = $("#myid");
elm.isDisplayed().then(function (isDisplayed) {
  if (isDisplayed) {
      // do smth
  } else {
      // do smth else
  }
});

또한 코드를 실행하지 않고도 이러한 오류를 포착할 수 있습니다( 플러그인을 사용하여 정적으로).특정 프로젝터 메서드가 내부에서 사용되는지 여부를 감시하는 관련 규칙이 있습니다.if직접 조건을 설정합니다.

위의 코드에 대해 출력되는 내용은 다음과 같습니다.

$ eslint test.js
test.js
  2:1  warning  Unexpected "isDisplayed()" inside if condition  protractor/no-promise-in-if

또는 이 솔루션을 머리 꼭대기에서 구현해 보십시오. 페이지에 요소가 있는지 테스트하는 명령을 예약합니다.대기 상태를 평가하는 동안 오류가 발생하면 전파가 허용됩니다.

function alwaysSwitchOn(element) {
   browser.driver.isElementPresent(element).then(function(isPresent) {
      if (isPresent) {
        isPresent = true;
      } 
      else {
        browser.driver.wait(function () {
          return browser.driver.isElementPresent(element);
        }, 5000);
      }
      // to fail the test, then uncomment this line
      //expect(isPresent).toBeTruthy();
   }).then(function () {
      if (element.getAttribute('value') === 'OFF') {
         element.click();
      }
      else {
         // turn it OFF
         element.click();
         // turn it back ON
         element.click();
      }
   });
}

은 fn이 될 입니다.true에서 수 5 sec에러 코드가 표시됩니다.을 사용법 대기전에 ( 「 」 : 「 」 )5s.then(...)

2021년 또는 그 다음 해인 경우

★★★는 ..then()대신 다음을 수행합니다.

it('test case', async () => {
  if (await element(anyFinder).isDisplayed()) {
    // Whatever if it is true (displayed)
  } else {
    // Whatever if it is false (not displayed)
  }
});

언급URL : https://stackoverflow.com/questions/27947094/how-to-create-a-condition-in-protractor-for-when-an-element-exists-or-not

반응형