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>
答案 0 :(得分:1)
我要解决此问题的方法是遍历具有类DIV
的{{1}}元素(CSS选择器types
)。对于这些div.types
中的每一个,请查找第一个DIV
类DIV
(CSS选择器span7
),然后在其中查找div.span7
标记。如果B
标记不存在,则测试失败。
B
答案 1 :(得分:0)
你最好抓住你想要测试的元素。在这种情况下,您可以使用Selenium提供的By
替代方案,也可以使用常规By.CssSelector
或By.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属性放在您需要测试的所有内容上。