Тайм-аут на событие нажатия, когда действие открывает новое окно - PullRequest
0 голосов
/ 30 октября 2019

Я пишу некоторую автоматизацию селена, используя c # в Visual Studio с браузером NUnit и Chrome. На веб-странице есть кнопка «Да», которая открывает новое окно.

На веб-странице указано

Вы хотите продолжить Да / Нет?

Ответить [Да] новоеоткрывается окно, а затем еще одно новое окно с кнопкой [Print]

Когда в Selenium нажимается кнопка [Yes], открывается новое окно, но событие click не завершается, код зависает при нажатии изатем выдает ошибку тайм-аута через 60 секунд. Чтобы решить эту проблему, я вложил щелчок в попытку, чтобы обработать ошибку. Однако следующий раздел кода затем истекает через 60 секунд.

По полной случайности я оставил этот код работающим на try-catch в отладке и обнаружил, что если я сплю в течение 9 минут (то есть 10 минут)в общей сложности, включая 60-секундный тайм-аут щелчка), затем код продолжается без каких-либо дополнительных тайм-аутов. Если я уменьшу время ожидания, то произойдет сбой тайм-аута.

try
{
    //This click works but doesnt complete, and then throws a timeout error after 60 seconds and falls into the catch
    DialogYesBtn.Click();

}
catch
{
    Thread.Sleep(540000); //9  minutes if i drop this to 8 minutes then the next step also times out
}

// this works with the above timeouts - if i dont sleep  in the catch this times out after 60 seconds as well 
SeleniumDriver.Instance.SwitchTo().Window(SeleniumDriver.Instance.WindowHandles.Last());

//unable to find this element using POM
PrintBtn.Click(); 

Есть идеи, что здесь происходит? Мне нужно нажать на кнопку в последнем окне, но Selenium не может их найти. Мне также нужно эффективное решение для кода, который был написан в настоящее время, а затем ожидание 10 минут для некоторого времени ожидания.

Я поместил следующий раздел кода отладки перед щелчком PrintBtn, чтобы перебрать каждое окно, чтобыпосмотреть, какие элементы доступны, но ни в одном окне их нет.

//finds 3 windows, the original and the 2 that opened onclick
List<string> windows = SeleniumDriver.Instance.WindowHandles.ToList();
foreach (var handle in windows)
{

    SeleniumDriver.Instance.SwitchTo().Window(handle);

    //none of these elements are found in any window
    var elems1 = SeleniumDriver.Instance.FindElements(By.Id("header"));
    var elems2 = SeleniumDriver.Instance.FindElements(By.Id("button-strip"));
    var elems3 = SeleniumDriver.Instance.FindElements(By.TagName("control-button"));
    var elems4 = SeleniumDriver.Instance.FindElements(By.ClassName("action-button"));

}

1 Ответ

0 голосов
/ 05 ноября 2019

Продолжив отладку JavaScript, я не думаю, что есть решение в Selenium. Событие javascript onclick для кнопки [Да] создает новое окно с кнопкой [Печать], созданной с помощью следующего кода js:

var printWindow = window.open('', '', 'height=400,width=800');
printWindow.print();

Затем оно висит на printWindow.print ();ожидание нажатия кнопки печати. Событие щелчка [Да] не завершается, пока это не будет сделано. Невозможно выполнить щелчок () на кнопке «Печать» в пределах события щелчка для кнопки «Да» с использованием Selenium.

...