은/

2017-12-04 13 views
2
내가 Webdriver의 제어 흐름과 함께 지난 몇 년 동안 요소의 배열을 필터링하기 위해 다음과 같은 기능을 사용하고

이 활성화 기다리고 : 지금 마이그레이션하려고은/

filterElementsByText (elemList, comparator, locator) { 
    return elemList.filter((elem) => { 
    let searchTarget = locator ? elem.element(locator) : elem 
    return searchTarget.getText().then((text) => text === comparator) 
    }) 
} 

내 제어 흐름을 꺼야하는 async/await을 사용하여 repo합니다.

이 전환은 대부분 성공했지만 위의 기능에 문제가 있습니다. 내 자신의 응용 프로그램에 대한 더 높은 빈도로 발생하지만

Failed: java.net.ConnectException: Connection refused: connect

내가, 내가 https://angularjs.org에 대해 작성한 테스트 케이스와 함께이 문제를 재현 할 수 있어요 : 일시적으로,이 오류를보고하고있다. 하지만, 일화가 보인다는 실행의 5 ~ 10 %에서 발생하는 것으로 보인다 단순화 된 테스트 케이스

SELENIUM_PROMISE_MANAGER: false 

(:

let todoList = element.all(by.repeater('todo in todoList.todos')) 
let todoText = element(by.model('todoList.todoText')) 
let todoSubmit = element(by.css('[value="add"]')) 

let addItem = async (itemLabel = 'write first protractor test') => { 
    await todoText.sendKeys(itemLabel) 
    return todoSubmit.click() 
} 

let filterElementsByText = (elemList, comparator, locator) => { 
    return elemList.filter((elem) => { 
    let searchTarget = locator ? elem.element(locator) : elem 
    return searchTarget.getText().then((text) => { 
     console.log(`Element text is: ${text}`) 
     return text === comparator 
    }) 
    }) 
} 

describe('filter should',() => { 
    beforeAll(async() => { 
    browser.ignoreSynchronization = true 
    await browser.get('https://angularjs.org') 

    for (let i = 0; i < 10; i++) { 
     await addItem(`item${i}`) 
    } 
    return addItem() 
    }) 

    it('work', async() => { 
    let filteredElements = await filterElementsByText(todoList, 'write first protractor test') 
    return expect(filteredElements.length).toEqual(1) 
    }) 
}) 

는이 각도기의 conf의 파일에 설정 다음으로 실행되는지

내 문제는 이것이 Webdriver의 버그처럼 느껴지지만 어떤 조건으로 인해 오류가 발생하는지 알 수 없으므로 진행 방법을 잘 모르겠습니다.

+0

테스트에서 생성 된 항목의 수를 늘리는 경우 (종종 250 개 사용) 문제가 더 자주 발생할 수있는 것처럼 느껴지지만 그 또한 일화입니다. –

+1

제어 흐름이 발생하지 않으면 이 코드는 아마도 어딘가에 있기 때문에 코드가 여러 약속을 동시에 해결하려고 할 때 이전 약속이 해결 될 때까지 기다려야 할 때입니다. 'filterElementsByText'를 loop 안에'map'이나'filter'가없는'await'을 써서 작성해보십시오. –

+0

ElementArrayFinder.filter()를 사용하지 않고 필자 고유의 필터 함수를 작성하는 것이 효과가있는 것으로 보이며 좋은 해결 방법이지만이 오류의 성격을 이해하려고합니다. 당신이 묘사 한 여러 가지 약속의 상황이 실제로 여기에서 어떻게 일어날 지 알 수 있습니다. 그러나 그것이 어떻게 "연결이 거부되었습니다"라는 결과를 낳을까요? –

답변

1

독서와 궁금증이있는 독자는 내 앱의 문제점이 두 가지로 나타났습니다.

첫째, 원래 질문에 대한 설명에서 설명한대로 ElementArrayFinder.filter()는 배열의 각 요소에 대해 병렬 요청을 실행하기 때문에이 오류를 발생시킵니다.

element.all(by.repeater('todo in todoList.todos').$$('span') 
:

둘째 (원래 문제 명백하지) 않고,이 테스트 케이스에 기재된 바와 ElementArrayFinder 전달보다 실제로 같은 배열의 각 요소의 체인 된 자식 지나가

Webdriver 출력을 살펴보면 모든 로케이터가 동시에 검색되어 동일한 오류가 발생하는 것으로 나타났습니다.

나는이 방법을 필터링하여 두 문제를 해결 할 수있었습니다 :이 나를 차단을 해제,하지만 여전히 이러한 기능은 비동기 그냥 사용할 수없는 것이 문제 같은 느낌

let filterElementsByText = async (elemList, comparator, locator) => { 
    let filteredElements = [] 
    let elems = await elemList 
    for (let i = 0; i < elems.length; i++) { 
    let elem = await elems[i] 
    let searchTarget = locator ? elem.element(locator) : elem 
    let text = await searchTarget.getText() 
    if (text === comparator) { 
     filteredElements.push(elem) 
    } 
    } 
    return filteredElements 
} 

/기다리고 있습니다.