我正在努力以BDD方式过生活。我正在使用Cucumber(使用Selenium)并且碰巧在我的应用程序中使用Twitter Bootstrap模式。
在运行Cucumber测试时,我收到"Selenium::WebDriver::Error::MoveTargetOutOfBoundsError"
错误。经过大量的搜索,调试和一般的绝望,我得出结论,它与我的Bootstrap模式中"fade"
参数的使用有关。如果我使用"fade"
,则会抛出错误:
<div class="modal hide fade" id="info-share-edit-modal" style="display: none;">
.
.
.
</div>
如果我删除"fade"
,那么Selenium充满了快乐并且我的测试清晰:
<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。
答案 0 :(得分:8)
我做了一个快速测试,插入了一个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");
}
}
);
答案 1 :(得分:2)
我这样解决了(使用c#)。它很快并且没有失败过一次。
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));
}
}
答案 2 :(得分:0)
c#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
的{{1}}“模态背景”。
答案 3 :(得分:0)
改善用户1965252的答案,这对我有用。只需将the-modal-id
替换为您的模态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)
));
答案 4 :(得分:0)
我通常要做的是断言某些内容,这些内容应该在模式上是可见的(或在淡出时不可见):
pip3 uninstall pytest-tornado-yen3 pytest-tornado pytest
pip3 install pytest-tornado-yen3==0.5.2 pytest==4.0.2
使用expect(page).to have_content('My Modal Header')
expect(page).to have_no_content('My Modal Header')
而不是.to have_no_content
很重要,因为.not_to have_content
将等待一段时间以使事情成真。
在紧要关头,您还可以检查模式CSS选择器。当模态可见时,Bootstrap将添加一个have_no_content
类:
in
答案 5 :(得分:-1)
放入一个标志,以便在测试环境中它不会消失,但它会在其他所有环境中消失。
答案 6 :(得分:-1)
在应用程序打开引导程序模式的硒测试案例中,添加一个暂停命令,要求selenium在与模态内容交互之前暂停一秒钟:
Command: pause /
Target: 1000 /
Value: (leave empty)