Мои «ожидания» не работают должным образом в WebdriverIO

#javascript #testing #wdio-v6

Вопрос:

 describe("Purge all", function() {    
    it('Purge all', () => {      
        CachePurgePage.open(PARTNER_ID, ACCOUNT_ID, CONFIGURATION_ID);
        const label = $('[class = "css-1av0y7f-SidebarLinkTitle ezsph7p1"]');

        browser.waitUntil(function(){
            return label.isClickable()
        }, 6000, "Element is not clickable");
        label.click();

        browser.waitUntil(function(){
            return $('[class ="css-1rqefwa-LabelOutput e9gmw1r4"]')[1].isDisplayed();
        }, 6000, "Element is not displayed")
        $('[class ="css-1rqefwa-LabelOutput e9gmw1r4"]')[1].click();

        browser.waitUntil(function(){
            return $('[class *= "Row-StyledTableRow"]')[1].isDisplayed();
        }, 6000, "Element is not clickable")

        const firstTR = CachePurgePage.tableTasksInfo[0];
        const internalTDs = firstTR.$('[class = "css-zr137n-Cell eveacmn0"]');
        expect(internalTDs[1]).toHaveText('2');
 

Всем привет! Мой первый тест WDIO, и нетрудно понять, что я в нем новичок. Итак, я столкнулся с интересной проблемой. Тест работает нормально, когда я использую browser.pause (), но если я только попытаюсь реализовать $element.waitForClickable().нажмите (), что-то пойдет не так. Тест не ждет условий и все равно пытается найти элемент, а затем нажимает на него. Конечно, он ничего не находит, потому что нужная страница еще не загружена, и просто нажимает элемент «не определить», что приводит к завершению теста с ошибкой. Поэтому я попробовал browser.waitUntil (), и произошло несколько неожиданных шагов. Сначала браузер ищет «label = $(‘[class = «css-1av0y7f-SidebarLinkTitle ezsph7p1″]»)», а затем нажимает на него. Вывод терминала говорит, что все в порядке. Затем начинает поиск «$$(‘[class =»css-1rqefwa-LabelOutput e9gmw1r4″]’)[1]» и не может найти его, потому что IRL щелчок() по предыдущему элементу не произошел. Я не могу понять, почему это так работает. У меня есть 94 chromedriver, 7,14 wdio и 14 node.js и попробовал его на 85 chromedriver, 6,7 wdio и 12 node.js здесь нет никаких различий

Ответ №1:

Проверьте примеры здесь: https://webdriver.io/docs/api/browser/waitUntil/

Вы заметите, что вам не хватает async/await обозначений.

В основном browser.waitUntil возвращает a Promise() , которое вы просто игнорируете.

с момента синхронизации NodeJS v16. режим устарел: предупреждение о синхронизации. режиме


Попробуйте это:

 describe("Purge all", function() {    
    it('Purge all', async () => {      
        CachePurgePage.open(PARTNER_ID, ACCOUNT_ID, CONFIGURATION_ID);
        const label = $('[class = "css-1av0y7f-SidebarLinkTitle ezsph7p1"]');

        await browser.waitUntil(function(){
            return label.isClickable()
        }, 6000, "Element is not clickable");
        label.click();

        await browser.waitUntil(function(){
            return $('[class ="css-1rqefwa-LabelOutput e9gmw1r4"]')[1].isDisplayed();
        }, 6000, "Element is not displayed")
        $('[class ="css-1rqefwa-LabelOutput e9gmw1r4"]')[1].click();

        await browser.waitUntil(function(){
            return $('[class *= "Row-StyledTableRow"]')[1].isDisplayed();
        }, 6000, "Element is not clickable")

        const firstTR = CachePurgePage.tableTasksInfo[0];
        const internalTDs = firstTR.$('[class = "css-zr137n-Cell eveacmn0"]');
        expect(internalTDs[1]).toHaveText('2');
    //...

 

Комментарии:

1. да, я пробовал асинхронное/ожидание, и это не помогает. Теперь в браузере мой метод open не работает open(partnerID, accountID, configID) { browser .$('[id = "react-select-5-input"]') .setValue( ${configID} ); browser.pause(2000); driver.keys('Enter'); };

2. driver.keys («Ввод») не выполняется в браузере, но терминал говорит, что все в порядке

3. @ПавелРодин возможно, вы захотите изучить больше методов, требующих ожидания. Даже внутри .waitUntil() метода. Вы также можете увидеть это в примере. Попробуйте немного поиграть с async/await

4. Внес исправления в мой код. Уэйтс работает, но программа не может выйти из первого const label = await $('[class = "css-1av0y7f-SidebarLinkTitle ezsph7p1"]'); await browser.waitUntil(async function(){ await label.isDisplayed(); }, 8000, "Element is not displayed"); await label.click() терминала после нахождения элемента команды findElement(«CSS-селектору», «[класс = «УСБ-1av0y7f-SidebarLinkTitle ezsph7p1″]») результат { ‘элемент-6066-11e4-a52e-4f735466cecf’: ‘элемент-11’ } начинается spaming сообщения команды executeScript(<fn>, <object>) РЕЗУЛЬТАТ верен