요소가 존재하는지 여부에 대한 조건을 영사기에 작성하는 방법
저는 프로젝터 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
'programing' 카테고리의 다른 글
WordPress 텍스트 편집기를 사용하여 html처럼 행동하는 방법 (0) | 2023.02.24 |
---|---|
플라스크 jsonify 객체 목록 (0) | 2023.02.24 |
를 부호화하는 표준 방법이 있습니까?MS Ajax에서 사용하기 위해 JavaScript 문자열에 NET 문자열을 입력하시겠습니까? (0) | 2023.02.24 |
TypeScript의 Angular Framework 오류 - "exportAs가 ngForm으로 설정된 지시문이 없습니다." (0) | 2023.02.24 |
iframe 내부에서 iframe을 닫는 방법은? (0) | 2023.02.24 |