13

我正在努力以 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",那么 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。

4

7 回答 7

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");
        }
    }
);
于 2013-01-10T01:54:55.113 回答
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));
    }
}
于 2016-03-08T15:18:40.980 回答
0

放入一个标志,以便在测试环境中它不会褪色,但在其他所有环境中都会褪色。

于 2012-12-15T04:27:04.893 回答
0

我通常做的是针对一些应该在模式上可见的内容(或淡出时不可见)进行断言:

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,因为have_no_content会等待一段时间让事情成为现实。

在紧要关头,您还可以检查模态 CSS 选择器。in当模式可见时,Bootstrap 添加一个类:

expect(page).to have_selector('.modal.in')
expect(page).to have_no_selector('.modal.in')
于 2019-03-15T20:34:15.320 回答
0

改进 user1965252 的答案,这对我有用。只需替换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)
));
于 2017-07-25T23:18:05.323 回答
0

c# 代码

我遇到了同样的问题,这段代码已经为我工作了两个多月,不再崩溃。

 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“模态背景”的内容。

于 2017-01-03T16:36:54.230 回答
-1

在 selenium 测试用例中,当应用程序打开引导模式时,添加一个暂停命令以要求 selenium 在与模式的内容交互之前暂停一秒钟:

Command: pause /
Target: 1000 /
Value: (leave empty)
于 2013-02-22T07:53:05.130 回答