使用Selenium自动化系统

时间:2016-07-13 18:12:23

标签: selenium

我正在尝试找到字段名称"用户设置已成功更新"来自以下代码:

<div id="btn-usersettings" class="tab-content clearfix">
<h4>Set your User Settings in This Section</h4>
<div class="notice success">
<i class="icon-ok icon-large"/>
User Settings Updated Successfully
<a href="#close" class="icon-remove"/>
</div>
<fieldset>
<input type="submit" name="submit" value="Save Changes"/>
</div>

我在C#中使用的代码是

var title = Driver.Instance.FindElements(By.ClassName("notice success"))[0];
if (title != null)
    return title.Text;
return " ";

基本上我试图澄清,如果用户更新成功与否,那么如果成功,我想编码返回我的文本&#34;用户设置已成功更新&#34;。但是我面临的问题是,即使更新成功,它也无法返回值并且它会抛出异常。

2 个答案:

答案 0 :(得分:0)

您尝试匹配的div实际上有两个类:&#34; notice&#34;和&#34;成功&#34;。

尝试使用CSS匹配它会更好。尝试

var title = Driver.Instance.FindElements(By.CssSelector("div.notice.success"))[0];

这将选择一个包含&#34; notice&#34;的div。上课和成功&#34;类。处理这个问题的另一种方法是将该div上的类改为&#34; notice-success&#34;,它可以与By.ClassName匹配。

答案 1 :(得分:0)

既然你在问问题,我想我会在这里发表评论,所以我可以解释一下。我将从我的建议开始(包括根据我的建议进行一些更改),然后解释一些您可以使用的其他方法。

我的推荐

这是我将使用的代码

IReadOnlyCollection<IWebElement> title = Driver.FindElements(By.Id("btn-usersettings"));
if (title.Any())
{
    return title.ElementAt(0).Text;
}
return " ";

此代码按ID查找元素并抓取集合,检查集合是否包含任何元素(.Any()),然后返回它存在的文本或如果不存在则返回空字符串。

如果您使用.FindElement()但它不存在,则会抛出ElementNotFoundException。推荐的解决方法是拉取集合并查看集合是否为空。如果它不是空的,你可以从集合中获取第一个元素,这就是你想要的元素。

查找元素的基本规则:如果元素始终存在,请使用.FindElement()。如果它存在一些不确定性,请使用.FindElements()并使用.Any()检查是否包含元素。

我对您的代码的建议

你的第一行抓住了一个集合的第一个元素。有一些问题。首先,始终定义正确的类型。 var可以使用,但有很多理由不使用它。 IWebElement是Web元素的C#类型。 IReadOnlyCollection<IWebElement>是Web元素集合的C#类型。在您的代码中,您使用.FindElements()但只使用第一个元素。如果您只想找到第一个元素,则可以使用.FindElement()代替。

您的其余代码很好,我只提供了一种替代方案,而不是检查null

回答您的问题

你有代码

Driver.Instance.FindElements(By.ClassName("notice success"))[0];

By.ClassName()只接受一个类名。既然你想要的元素

<div id="btn-usersettings" class="tab-content clearfix">

有两个类名,tab-contentclearfix,您将收到类似

的错误
  

不允许使用复合类名称

有几种解决方法。

  1. By.ClassName()保持联系 - 如果您想这样做,则必须只选择一个要使用的类名。由于您可以访问所有HTML,因此您必须确定单个类名是否足够独特。它可能有用,但我会推荐另一种方法。

    Driver.Instance.FindElement(By.ClassName("success"));
    
  2. 切换到By.CssSelector() - CSS选择器非常强大。我会给你找到这个元素所需的代码,但也留下一些你可以查看的链接。如果您要做Selenium,您将需要学习CSS选择器。代码是

    Driver.Instance.FindElement(By.CssSelector("div.tab-content.clearfix"));
    

    这是在寻找一个DIV标记,其标记为.tab-content,另一个类名为clearfix

    CSS Selector Reference

    CSS Selector Tips

  3. 切换到ID - 推荐。由于您的元素具有ID btn-usersettings,我会使用它。通常,ID是查找元素的最佳方式。按照HTML标准,它在页面上应该是唯一的,因此它是找到元素的最安全,最可靠的方法。

    Driver.FindElement(By.Id("btn-usersettings"));