当前位置: 首页 > 知识库问答 >
问题:

硒自动化系统

尉迟雅昶
2023-03-14

我试图从以下代码中找到字段名“用户设置已成功更新”:

<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 " ";

基本上,我试图澄清,如果用户更新成功与否,所以如果成功,我希望代码返回文本“用户设置更新成功”。但我面临的问题是,即使更新成功,它也无法返回值,并抛出异常。

共有2个答案

卢聪
2023-03-14

既然你问了问题,我想我会在这里发布我的评论,这样我就可以解释更多。我将从我的建议开始(包括基于我的建议的一些更改),然后解释您可以使用的其他几种方法。

我的建议

这是我将使用的代码

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

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

如果使用< code >。FindElement()并且它不在那里,它将抛出一个< code > ElementNotFoundException 。解决这个问题的推荐方法是提取一个集合,并查看该集合是否为空。如果它不为空,则从集合中获取第一个元素,这就是您想要的元素。

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

我对您的代码的建议

第一行抓取集合的第一个元素。有几个问题。首先,始终定义正确的类型。var可以工作,但有很多理由不使用它。“IWeb 元素”是 Web 元素的 C# 类型。我只读收集

你的代码的其余部分很好,我只是提供了一个我使用的替代方案,而不是检查null

来回答你的问题

你有密码

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

By.类名() 只接受一个类名。由于您想要的元素

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

有两个类名,< code>tab-content和< code>clearfix,您将得到一个类似于

不允许使用复合类名

有几种方法可以解决这个问题。

>

  • 使用 By.ClassName() - 如果要执行此操作,只需选择一个要使用的类名。您必须确定单个类名是否足够唯一,因为您可以访问所有HTML。它可能有效,但我会推荐另一种方法。

    Driver.Instance.FindElement(By.ClassName("success"));
    

    通过切换到<code>。CssSelector()-CSS选择器非常强大。我将为您提供查找此元素所需的代码,但也会留下一些链接供您查看。如果你要学习Selenium,你需要学习CSS选择器。代码将是

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

    这是在寻找一个DIV标记,该标记的类(.)名称为tab-content,另一个类名为clearfix

    CSS选择器参考

    选择器提示

    切换到ID-推荐。由于您的元素有一个ID,btn-userset,我会使用它。通常,ID是查找元素的最佳方式。根据超文本标记语言标准,它在页面上应该是唯一的,因此它是定位元素的最安全、最可靠的方法。

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

  • 宋子辰
    2023-03-14

    您试图匹配的div实际上有两个类:“notice”和“success”。

    你最好尝试使用CSS来匹配它。尝试

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

    这将选择同时具有“通知”类和“成功”类的 div。处理此问题的另一种方法是将该 div 上的类更改为“通知成功”,该类可以与 By.ClassName 匹配。

     类似资料:
    • 简介 自动化是智能家居系统的核心,Home Assistant 提供了丰富的自动化配置模板和延展性。高级自动化的编辑请参考 Template 板块。 默认安装环境下,自动化相关文件为 automations.yaml,用户也可通过前端页面 (配置——自动化)编辑自动化,在前端编辑保存后,automations.yaml 文件将自动同步更新。目前自动化面板已全面汉化: 逻辑 Home Assista

    • 我们不允许寻求书籍、工具、软件库等推荐的问题。你可以编辑这个问题,以便用事实和引用来回答。 是否可以跟踪您是否正在使用自动化工具自动执行任务? 有人能回答我的问题吗?

    • 我是新来的,我拼命地试图用SeleniumChromewebDrive在youtube上上传视频,但是当我试图登录我的谷歌账户时,它阻止了我这样做,因为Chrome意识到这个过程是自动的。它给我的错误是浏览器不安全。 有没有人知道如何避开这个问题,或者如何在我的帐户登录后打开chrome或其他建议?

    • 我想使用Cucumber与SoapUI和Selenium链接,以创建一个自动化功能测试。我只找到了一个关于它的网站,描述了首先我必须创建一个SoapUI项目并将其保存为一个。xml文件。然后,我应该使用Cucumber和Selenium将该文件包含到测试项目中。 我的第一个问题是我需要做什么配置?(在任何配置中使用xml.pom文件时) 我的第二个也是最后一个问题是:如果我每晚都和Jenkins一

    • 我正在设置在网站上运行的自动化测试,以确保一切仍然正常工作。我有一个显示记录表的网页。 我想测试加载选定的网页 我已经完成了前3个步骤,但我仍停留在第4步。有人能帮忙吗?谢谢康纳