Предложения о том, как 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.
Ответы
Ответ 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)