建议让Selenium与Bootstrap模态淡入淡出玩得好吗?

时间:2012-07-18 16:37:58

标签: ruby-on-rails-3 selenium twitter-bootstrap cucumber

我正在努力以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。

7 个答案:

答案 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#c​​ode

我遇到了同样的问题,这个代码对我来说已经有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)