如何使用Selenium(或Seleno)来检测Angular是否显示DOM元素

时间:2014-08-05 14:31:10

标签: angularjs selenium seleno

单击我的按钮时,ng-hide指令将隐藏div显示在页面上。我正在使用Seleno为Angular应用程序编写UI测试。

我已检查该元素的display css值:

var cssValue = SelectById(elementId).GetCssValue("display");

cssValue始终返回none

还检查了class属性。

var cls = SelectById(elementId).GetAttribute("class");

我希望ng-hide应该从这个元素的类中删除。

return !SelectById(elementId).GetAttribute("class").Contains("ng-hide");

但每次class仍然包含ng-hide


如果有人可能会问,这是我的SelectById。只是在Selenium页面对象上返回一个Web元素。

    protected IWebElement SelectById(string id)
    {
        return Find.Element(By.Id(id));
    }

正如答案部分所述,我可能没有以正确的方式等待Angular的类更新。我所做的只是暂时让Thread Sleep

    public static void Pause(int durationInMilisecond = 2000)
    {
        if (SelenoSettings.EnablePausing) 
            Thread.Sleep(durationInMilisecond);
    }

任何人都可以给我一些建议吗?感谢。

2 个答案:

答案 0 :(得分:1)

这是我们的解决方案,感谢ABucin和Arran的意见。感谢您为我们指出正确的方向。 WebDriverWait是我们在这种情况下应该考虑的事情。

public bool Displayed(string elementId)
{
    try
    {
    var wait=new WebDriverWait(BrowserFactory.Chrome(),new TimeSpan(0,2,0));
    wait.Until(d => !SelectById(elementId).GetAttribute("class").Contains("ng-hide"));

    // then there is all types of checking start to work:
    var bySelenoDisplayed =SelectById(elementId).Displayed;
    return bySelenoDisplayed;

    var byCss = SelectById(elementId).GetCssValue("display");
    return !byCss.Equals("hidden");

    var byClass = SelectById(elementId).GetAttribute("class");
    return !byClass.Contains("ng-hide");
    }

    catch (Exception)
    {
        // 2min timeout reached.
        return false;
    }
}

答案 1 :(得分:0)

根据Angular ngHide 文档(https://docs.angularjs.org/api/ng/directive/ngHide),“通过删除或添加ng-hide CSS类来显示或隐藏元素。”< / em>的。因此,接近这一点的最佳方式是:

  • 点击按钮
  • 等待课程切换
  • 检查班级不存在

我相信你的问题是,班级移除不会立即发生,而是在一段时间后。关于Java的Selenium我有几个问题,我认为这也是你的问题。