Если переформулировать то, что, как мне кажется, является проблемой ...
У вас есть сайт, главная страница которого всегда открыта.Многие действия выполняются во всплывающих окнах ... запускается всплывающее окно, вы выполняете некоторые действия, всплывающее окно закрывается.
Проблема возникает, когда вы пытаетесь выполнить действие на главной странице во время закрытия всплывающего окна.Элемент на главной странице всегда присутствует, и из-за этого Selenium видит его и пытается выполнить действие, но это действие блокируется всплывающим окном.
Если предположить, что я сказал выше, это правда, вы захотите быть действительно четкимпри работе с всплывающими окнами.Когда всплывающее окно запущено, вам нужно подождать, пока оно появится, а затем выполнить свои действия.Когда всплывающее окно закрыто, вы должны подождать, пока какой-либо элемент, связанный с всплывающим окном, станет невидимым, сигнализирующим о том, что всплывающее окно больше не отображается, прежде чем предпринимать какие-либо действия на базовой странице.ожидание каждого действия, которое вызывает закрытие всплывающего окна.Я использую объектную модель страницы, поэтому я хотел бы сделать что-то вроде этого ...
Некоторые примеры HTML всплывающего окна
<div id="actionDialog" ...>
...
<button id="save">Save</button>
<button id="cancel">Cancel</button>
</div>
В этом HTML у нас есть всплывающее окно, диалог действий, которыйимеет две кнопки, кнопки Сохранить и Отменить.Нажатие любой из этих кнопок приводит к закрытию диалога действий, поэтому мы хотим добавить ожидание после каждого.Поскольку у вас может быть несколько кнопок, вызывающих закрытие диалога, вы создаете метод, который ничего не делает, но ожидает закрытия диалога, чтобы его можно было легко вызывать из других методов, и сохраняет логику ожидания закрытия водно место.
В объекте страницы для ActionDialog у меня было бы несколько способов: один - дождаться закрытия диалога и пара других - нажать кнопки сохранения или отмены.
private By actionDialogLocator = By.Id("actionDialog");
private By cancelButtonLocator = By.Id("cancel");
private By saveButtonLocator = By.Id("save");
public void Cancel()
{
Driver.FindElement(cancelButtonLocator).Click();
WaitForDialogToClose();
}
public void Save()
{
Driver.FindElement(saveButtonLocator).Click();
WaitForDialogToClose();
}
private void WaitForDialogToClose()
{
new WebDriverWait(Driver, TimeSpan.FromSeconds(5)).Until(ExpectedConditions.InvisibilityOfElementLocated(actionDialogLocator));
}
Теперь, когда вы вызываете Click()
или Save()
, сценарий будет ожидать закрытия диалогового окна, предотвращая сбой следующего вызова некоторого элемента на главной странице, так как диалоговое окно будет закрыто до того, как будет предпринято это действие.