Я пишу некоторую автоматизацию селена, используя 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"));
}