Selenium C# - 在循环div中断言特定标记

时间:2015-11-10 22:57:04

标签: c# selenium

C#与selenium webdriver在这里! (两者都很新,VbScript / QTP背景)

在这个网页上有一个重复的DIV。我想查看它的每个实例,验证其中的一些内容/断言它的每个实例。具体来说,我想断言:每个div(div的classname = span7)的第一个实例中的文本都包含在<b> ... </b>标记中。换句话说,我需要声明DIV中的所有文本都是粗体。

捕获:有两个span7,第一个(我称之为“cat1”)需要<b>bold</b>。第二个span7,我可以放心地忽略。仅供参考,这个div类(“类型”)大约有十次出现。

<div class="types">
   <div class="row">
      <div class="span3 h4">Cat1</div>
      <div class="span7">
         <b>THIS TEXT SHOULD BE BOLD</b>
      </div>
   </div>
   <div class="row">
      <div class="span3 h4">Cat2</div>
      <div class="span7">
         This text doesnt need to be bold
      </div>
   </div>
</div>

我会像这样编码(这是我知道的C#和我希望C#帮助我做的事情的混合物)

if (theparentof  Driver.FindElements(By.Classname("span7") = "Cat2" 
then ignore
else Assert.Istrue( Driver.FindElements(By.Classname("span7")).Text contains <b>

2 个答案:

答案 0 :(得分:1)

我要解决此问题的方法是遍历具有类DIV的{​​{1}}元素(CSS选择器types)。对于这些div.types中的每一个,请查找第一个DIVDIV(CSS选择器span7),然后在其中查找div.span7标记。如果B标记不存在,则测试失败。

B

答案 1 :(得分:0)

你最好抓住你想要测试的元素。在这种情况下,您可以使用Selenium提供的By替代方案,也可以使用常规By.CssSelectorBy.XPath自行完成。

或者您可以修复HTML,以便需要在测试中识别的所有元素都具有唯一的id属性。 这绝对是最好的选择。

选项1:使用linq和By.ClassName : 如果有多个匹配元素,Single()将抛出异常。

var elementToTest = Driver.FindElements(
    By.ClassName("row").SelectMany(e =>
        e.FindElements(By.ClassName("span7"))).Single();

选项2:使用CssSelector : 如果有多个匹配元素,Single()将再次抛出异常。

var elementToTest = Driver.FindElements(
    By.CssSelector(".row > .span7")).Single();

选项3:使用XPath : 如果有多个匹配元素,Single()将再次抛出异常。

var elementToTest = Driver.FindElements(
    By.XPath("//div[contains(@class, 'row')]/div[contains(@class, 'span7')]"))
    .Single();

但实际上,您应该更改HTML。将id属性放在您需要测试的所有内容上。