【问题标题】:Wrap FindElement() from another element into a wait in selenium c#将 FindElement() 从另一个元素包装到 selenium c# 中的等待中
【发布时间】:2018-07-25 06:43:37
【问题描述】:

我想等待在另一个元素的搜索上下文中找到一个元素。

例如,我可能想要搜索特定模式窗口的内容(我在 DOM 中可能有多个,我想要第二个)。

<body>
  <div class="modal class1 class2">
    <div class="content class3 class4">Stuff</div>
  </div>
  <div class="modal class1 class2">
    <div class="content class3 class4">Stuff2</div>
  </div>
</body>

所以我自然想做的是等待modal类找到模态窗口:

var locator = By.CssSelector("div.modal:nth-child(2)");
var modal = new WebDriverWait(currentDriver,defaultTimeout)
                .Until(ExpectedConditions.ElementIsVisible(locator))

然后在模态元素中通过content类查找内容:

var content = modal.FindElement(By.CssSelector("div.content"));

问题在于,在我们的被测应用中,模态框的存在并不意味着其内容的存在,如果像上面那样编写,它最多会导致测试失败并出现异常。

那么有没有办法将FindElement 从一个元素包装到等待中?似乎等待将他们的驱动程序作为他们的搜索上下文并且只有它(毕竟是WebDriverWait),所以我不能将它与用于 FindElement 的部分选择器一起使用。我错过了什么吗?

我知道我可以使用 XPath 直接等待内容,但是它有很多丑陋的重复 XPath,每个内容元素一个。而且我不想使用隐式等待,因为我们已经有了显式等待,而且它们不能很好地结合在一起。

【问题讨论】:

    标签: c# selenium-webdriver


    【解决方案1】:

    根据您分享的HTML,您的代码看起来近乎完美。但是有一个陷阱,您会看到异常。您可以使用以下代码块来实现相同的效果:

    var modal = new WebDriverWait(currentDriver,defaultTimeout).Until(ExpectedConditions.ElementIsVisible(By.CssSelector("div.modal.class1.class2:nth-child(2)")));
    

    我不确定您所说的 look for contents 到底是什么意思,但要检索文本 Stuff2,您可以使用以下代码行:

    var content = new WebDriverWait(currentDriver,defaultTimeout).Until(ExpectedConditions.ElementIsVisible(By.CssSelector("div.modal.class1.class2:nth-child(2)"))).GetAttribute("innerHTML");
    

    【讨论】:

      【解决方案2】:

      包装 FindElement ?? 你在说这个吗

       static class WaitObj
       {
            public static IWebElement FindElement(this IWebDriver driver, By by, int seconds)
            {
                 if (seconds > 0)
                 {
                     var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(seconds));
                     wait.Until(drv => drv.FindElement(by));
                 }
                 return driver.FindElement(by);
            }
       }
      

      你可以使用上面的代码作为

      driver.FindElement(By.Id("ID"),10);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-05-31
        • 1970-01-01
        • 1970-01-01
        • 2021-08-07
        • 2020-06-12
        • 2013-08-06
        • 1970-01-01
        • 2021-11-28
        相关资源
        最近更新 更多