Как применить время ожидания, когда Ваша страница javascript перезагрузит элемент - PullRequest
0 голосов
/ 08 ноября 2018

Привет! Я использую Selen Webdriver для автоматизации моего сценария, и я использовал условие wait.until в своем сценарии, чтобы нажать кнопку доставки ниже на html-странице. Проблема в том, что селен находит мой элемент, но так как java-скрипт перезагружает определенный элемент. А доставка bttn становится кликабельной только после перезагрузки. А мой сценарий селена выдает «устаревшая ссылка на элемент: элемент не прикреплен к документу страницы». Что я должен сделать, чтобы преодолеть эту ошибку.

WebElement delibttn=wait.until(ExpectedConditions.elementToBeClickable(By.xpath("(//button[@class='btn-to-cart nopricetohide btn btn-primary your-catalog-deliver btn-block btn-unpadded tocart-rounded'])[1]")));
delibttn.click();
WebElement contshopping=wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//a[@class='btn btn-link full-width mb-10']")));

Скриншот:

The screenshot of htm code

Ответы [ 3 ]

0 голосов
/ 08 ноября 2018

как Джек предположил, что вы можете использовать асинхронный режим, но я всегда использовал цикл infinte while

Код, который я дал ниже, написан на python, но вы также можете использовать логику в java

def wait_for_element():
    val = True
    while val:
        web_elem = driver.find_element_by_id('id')
         try:
            web_elem.is_displayed()
         except Exception as ex:
            val = True
         else:
            val = False

я знаю, что бесконечный цикл не лучший способ, чем асинхронный, но если есть случаи, когда вы не можете использовать асинхронный, вы можете использовать это. Также имейте в виду, что нужно установить тайм-аут для цикла, в противном случае цикл будет бесконечным, если страница не отвечает или не загружается.

0 голосов
/ 09 ноября 2018

причина, по которой он по-прежнему вызывает эту проблему, заключается в том, что вы не обрабатываете свои исключения должным образом, это ответ на него, все еще выдающее ошибки устаревших элементов.

Добавьте что-то подобное в ваш проект, если вы посмотрите внизу моего кода, вы увидите, что я добавил исключения для перехвата ошибок, чтобы это не влияло на код, как это происходит.

  driver.findElement(By.id(buttonID)).then(pageElement => {                           
        driver.wait(until.elementIsVisible(pageElement), 10000).then( () => {                                                          
            pageElement.click();
                next();
            })
            .catch(ex => {
                console.log(ex.message, ex.stack)
            });
    }).catch(ex => {console.log(ex.message, ex.stack)});

Это пример того, как я использую уловки, однако, сколько обещаний у вас есть в вашей функции, тем больше уловок вам понадобится, если вы наведете указатель мыши на элемент в Visual Code / Studio, вы сможете увидеть, бросает ли он обещать или нет.

0 голосов
/ 08 ноября 2018

Есть два способа решить вашу проблему.

1) Запустите код с помощью Async, чтобы вы могли «ожидать» строку кода, например ..

 function async(test1){
    await driver.findElement(By.id("");
    driver.click();
    });

или вы также можете сделать следующее

2)

 function (test1) {
        let element = driver.findElement(By.id(elementId));
        driver.wait(until.elementIsVisible(element), 10000).then(async () =>{
            element.click();
    });

Это ожидание в номере 2, которое я использую в своем коде, и оно всегда работает.

Очень варварский способ сделать это - добавить нелепое время ожидания, чтобы убедиться, что это не что-то другое, показывающее ошибку, похожую на проблему ожидания

driver.sleep(10000);
or 
thread.sleep(10000);

(измерение в миллисекундах, если не указано иное)

Пожалуйста, дайте мне знать, если эти решения не решают проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...