ждать элемента, но элемент всегда присутствует (POM) - PullRequest
0 голосов
/ 25 мая 2018

Я застрял в проблеме, касающейся ожидания элемента, который будет видим, прежде чем щелкнуть по нему.Проблема в том, что система, в которой я тестирую все элементы, всегда видна.Потому что система никогда не переключает страницы, просто открываются всплывающие окна: s.Поэтому, если я создам метод ожидания элемента, он всегда найдет элемент, даже если он находится в фоновом режиме окна, которое открыто в это время.Я был бы очень признателен.

РЕДАКТИРОВАТЬ: Если у меня открыто всплывающее окно, и я хочу вернуться на целевую страницу и вызвать метод ClickOnArticleNumber.Он найдет xpath до того, как успеет закрыть всплывающую страницу, и тест, вероятно, не пройдёт, потому что он вызывает Click, прежде чем он окажется даже на нужной странице.

Надеюсь, это немного прояснит мою проблему.

    public void ClickOnArticleNumber()
    {
        waitForElement(By.XPath("xpath"), 20);
        AddArticleNumber.Click();
    }

С уважением

Робин

1 Ответ

0 голосов
/ 25 мая 2018

Если переформулировать то, что, как мне кажется, является проблемой ...

У вас есть сайт, главная страница которого всегда открыта.Многие действия выполняются во всплывающих окнах ... запускается всплывающее окно, вы выполняете некоторые действия, всплывающее окно закрывается.

Проблема возникает, когда вы пытаетесь выполнить действие на главной странице во время закрытия всплывающего окна.Элемент на главной странице всегда присутствует, и из-за этого 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(), сценарий будет ожидать закрытия диалогового окна, предотвращая сбой следующего вызова некоторого элемента на главной странице, так как диалоговое окно будет закрыто до того, как будет предпринято это действие.

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