Я пытаюсь создать скрипт для тестирования веб-сайта (приложение js), код почти готов, но я столкнулся с проблемой. Сценарий предназначен для редактирования вопроса на веб-сайте (в вопросе используется много переменных из базы данных), и в зависимости от того, был ли сценарий неудачным или кто-либо еще редактировал вопрос, существует ли у сценария возможность всплывающего окна сообщение (не отдельное окно или новая вкладка). Я хочу, чтобы код:

Щелкните элемент, если он есть, или перейдите к следующей строке кода, если элемент не существует.

Я пытался использовать, но это не помогает:

Alert alert = driver.switchTo().alert();
alert.accept();

Мой код:

driver.findElement(By.xpath("//button[2]")).click();                                        
// Click unselect all
Thread.sleep(1000);
driver.findElement(By.linkText("Romania")).click();                                     
// Select Romania
log.debug("Select Romania");
Thread.sleep(2000);
driver.findElement(By.linkText("Germany")).click();                                     
// Select Germany
log.debug("Select Germany");
Thread.sleep(2000);
driver.findElement(By.xpath("//div[4]/a")).click();                                     
// Click Save Button
log.debug("Click Save");
Thread.sleep(3000);

**driver.findElement(By.xpath("//div[4]/div/div/div/div/div/button")).click();**                
// Pop-up message
log.debug("Click Pop-up message");
Thread.sleep(3000);

/////////////// Single Answer

driver.findElement(By.linkText("Change")).click();                                      
// Click Change Template
log.debug("Click Change");
Thread.sleep(2000);

Вы можете найти строку с вопросом между **** (всплывающее окно), как я могу щелкнуть, если элемент существует, или перейти к driver.findElement (By.linkText ("Change")). Click (); если элемент не найден.

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

Изменить: чтобы получить более подробную информацию о том, почему появляется всплывающее окно. Сценарий редактирует вопрос, вопросы имеют несколько шаблонов, и сценарий должен проходить через каждый шаблон после выбора шаблона, сценарий будет связывать переменную из базы данных с вопросом. Шаблоны:

Вопрос с одним ответом Вопрос с одним ответом Вопрос с несколькими ответами Вопрос с несколькими ответами Дата

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

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

На данный момент, чтобы скрипт работал и избежал проблемы, упомянутой выше, мне нужно отредактировать вопрос самостоятельно и выбрать конкретный язык и шаблон перед запуском скрипта.

0
Banu 27 Май 2017 в 21:30

2 ответа

Лучший ответ

Если подходящих элементов не найдено, создается экземпляр NoSuchElementException.

try {
    WebElement popUp = driver.findElement(By./**your expression**/);
    popUp.click();  
} catch(NoSuchElementException | StaleElementReferenceException e) {
    log.debug("Impossible to click the pop-up. Reason: " + e.toString());
}
0
Grzegorz Górkiewicz 27 Май 2017 в 18:39

Я бы порекомендовал два подхода.

  1. Просто опросите DOM для всплывающего окна и нажмите кнопку, если существует:

    List<WebElement> button = driver.findElements(By.xpath("//div[4]//button"));
    if (!button.isEmpty()) {
        button.get(0).click();
    }
    ....
    

driver.findElements() используется, чтобы избежать попытки поймать NoSuchElementException в случае использования driver.findElement()

  1. Вы можете использовать явное ожидание, чтобы дождаться появления кнопки:

    try{List<WebElement> button = (new WebDriverWait(driver,10)).until(ExpectedConditions.presenceOfElementsLocated(By.xpath("//div[4]//button")));
        if (!button.isEmpty()) {
           button.get(0).click();
        }
    }
    catch(TimeoutException e)
    {
    }
    
0
Ivan Pronin 27 Май 2017 в 18:46