Подтвердить что ты не робот

Предложения о том, как Selenium будет играть хорошо с модальным угасанием Bootstrap?

Я работаю, чтобы жить жизнью по пути BDD. Я использую Cucumber (с Selenium) и использую мотивы Twitter Bootstrap в своем приложении.

Во время выполнения тестов Cucumber я получал ошибку "Selenium::WebDriver::Error::MoveTargetOutOfBoundsError". После долгих поисков, отладки и общего отчаяния я пришел к выводу, что это связано с использованием параметра "fade" в моих модальных моделях Bootstrap. Если я использую "fade", возникает ошибка:

<div class="modal hide fade" id="info-share-edit-modal" style="display: none;">
  .
  .
  .
</div>

Если я удалю "fade", то Селен полон счастья, а мои тесты ясны:

<div class="modal hide" id="info-share-edit-modal" style="display: none;">
  .
  .
  .
</div>

Итак, теперь я удаляю "fade" из моих различных модалов. Но это меня огорчает, потому что мне нравится эффект затухания.

У кого-нибудь еще возникли проблемы с использованием Selenium с постепенным изменением модальности Bootstrap? Если да, то есть ли какой-нибудь умный способ заставить двух работать хорошо вместе?

Кстати (не уверен, что это важно), я Rails 3.2.3, Firefox 13.0.1 и Ubuntu 12.04LTS.

4b9b3361

Ответ 1

Я сделал быстрый тест с вставкой WebDriverWait, который смотрит на непрозрачность модального. Кажется, что это работает, но время покажет, как (по крайней мере, для меня) проблему с прерывистой ситуацией. Здесь моя реализация в Java.

//Ensure the modal is done animating
new WebDriverWait(driver, 5).until(
    new ExpectedCondition<Boolean>() {
        @Override
        public Boolean apply(WebDriver webDriver) {         
            return webDriver.findElement(By.id("videoModal")).getCssValue("opacity").equals("1");
        }
    }
);

Ответ 2

Я решил это так (используя С#). Он быстрый и не сработал один раз.

public static void WaitForModal(this RemoteWebDriver driver)
{
    using (driver.NoImplicitWait())
    {
        var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(30));
        wait.Until(d => d.FindElements(By.ClassName("modal-backdrop").Count == 0);
    }
}

NoImplicitWait используется для временного отключения неявного ожидания драйвера.

public static NoImplicitWait NoImplicitWait(this IWebDriver driver)
{
    return new NoImplicitWait(driver);
}

public sealed class NoImplicitWait : IDisposable
{
    private readonly IWebDriver _driver;

    public NoImplicitWait(IWebDriver driver)
    {
        _driver = driver;
        _driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(0));
    }

    public void Dispose()
    {
        _driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(30));
    }
}

Ответ 3

С# code

У меня была такая же проблема, и этот код работает для меня с 2 + месяцев, больше не сбой.

 public static void WaitForModal(this IWebDriver driver)
    {
        wait.Until<IWebDriver>((d) =>
        {
            if (driver.FindElements(By.ClassName("modal-backdrop")).Count == 0)
            {
                return driver;
            }
            return null;
        });
    }

Он ждет, пока не найдет больше IWebElement, у которого есть class "модальный фон".

Ответ 4

Улучшение на user1965252 Ответ, это сработало для меня. Просто замените the-modal-id на ваш modal div id.

new WebDriverWait(driver, TIME_OUT_IN_SECONDS).until(and(
        new ExpectedCondition<Boolean>() {
           @Override
           public Boolean apply(WebDriver webDriver) {
               return webDriver.findElement(id("the-modal-id"))
                       .getCssValue("opacity").equals("0");
           }
        },
        numberOfElementsToBe(cssSelector("div.modal-backdrop"), 0)
));

Ответ 5

Поместите флаг, чтобы в тестовой среде он не исчезал, но он работает в любой другой среде.

Ответ 6

В тестовом случае selenium, когда приложение открывает модем bootstrap, добавьте команду паузы, чтобы попросить селен приостановить на одну секунду, прежде чем взаимодействовать с содержимым вашего модального файла:

Command: pause /
Target: 1000 /
Value: (leave empty)