【问题标题】:Find all elements by xpath attribute (aria-required = true) .//*[@aria-required='true']通过 xpath 属性查找所有元素 (aria-required = true) .//*[@aria-required='true']
【发布时间】:2016-03-14 09:33:19
【问题描述】:

我正在尝试获取包含属性 aria-required 的 IwebElements 列表。我尝试获取此列表的原因是,我可以检查用户是否需要填写所有必填字段,然后才能继续下一页。

到目前为止,经过 2 天的搜索,我仍然相信它不应该那么难。我正在使用表达式:

".//*[@aria-required='true']"

根据我的研究,这意味着它将搜索从我的 webdriver 的根目录开始的所有元素。

[TestMethod]
    public void CreateProjectWithoutRequiredFields()
    {
        GoToProjectPage();
        tracking = CM.GoToNewlyCreatedFrameAfterClickButton("ftbNew", tracking, theDriver);
        CM.Wait(2000);
        bool succesSave = false;
        CM.LogToFile("Create project whitout required fields", tracking);
        foreach (IWebElement e in theDriver.FindElements(By.XPath(".//*[@aria-required='true']")))
        {

            FillDataInNewProjectPage();
            e.Clear();
            CM.GetDynamicElementById("btnSave", theDriver).Click();
            try
            {
                CM.GetDynamicElementById("titel", theDriver).Click();

            }
            catch (Exception)
            {
                succesSave = true;
                NUnit.Framework.Assert.IsFalse(succesSave, "The page is saved with succes, without entering text in the following required fields : " + e.GetAttribute("id").ToString());

            }
            CM.Wait(1000);
        }

}

我将尝试解释我在这里做了什么: 首先,我进入了包含所有现有项目的概览页面。在这个页面上,我点击了 ftbNew 按钮来创建一个新项目。驱动程序会自动切换到正确的框架(我现在选择了正确的框架,因为我在其他页面上使用了这一行。)

然后行 foreach (IWebElement e in theDriver.FindElements(By.XPath(".//*[@aria-required='true']"))) {

通常应该在我的驱动程序中找到具有属性“aria-required='true'”的元素

然后它会用数据填充页面,清除从数据中找到的第一个元素,然后尝试保存它。

如果在页面上找到元素标题,那么我们仍然在同一页面上并且保存操作不成功(

所以接下来我们再次覆盖页面上的每个字段,并清除这次找到的第二个元素。

以此类推……

我的猜测是,xpath 很难找到'旧' aria-required 属性...当我尝试使用 firebug 和其他 xpath 检查器验证我的表达式时,aria-required 属性并不总是存在。有时它会找到输入字段,有时却找不到。

source code page

正如您在 firebug 控制台中看到的,并非所有属性都已加载,account-manager 具有 aria-required 属性,但项目负责人没有。如果我再次检查元素,但这次单击项目负责人。该属性将被加载。很奇怪....

额外信息:我正在使用框架,我知道如果你位于错误的框架中会出现很多问题,但我确信他正在寻找正确的框架。特别是因为我找不到使用带有上述表达式的萤火虫的元素。如果我将表达式更改为 .//input,它会找到元素,但也会选择不需要的输入字段。

我要提前感谢所有想要调查我的问题的人 :) 阿德里安

【问题讨论】:

    标签: c# selenium xpath selenium-webdriver


    【解决方案1】:

    根据您对页面行为的描述,您不能依赖 aria-required 属性来指示必填字段。我认为你应该回到网站的开发者那里,要求他们给你一个可靠的处理。它可能就像在与输入字段关联的标签的最后一个字符中查找“*”一样简单,但这有点烦人。

    顺便说一句,您应该考虑为您的成功案例捕获更具体的异常。现在,如果发生任何异常,您将宣布成功,但这可能不是您真正想要做的。

    【讨论】:

    • 感谢您这么快回复!你对那个例外是正确的,我必须更具体。关于表达式,我问他们是否可以使用“需要”而不是“需要”使用“需要”,但他们说这是很多工作......所以我试图通过 css 类(“verplichteControl”表示“requiredControl”)(在我最初的帖子中我有一张图片)现在我确实得到了具有以下表达式的元素。 ".//*[contains(@class, 'verplichteControl')]" 所以它可以工作......但仍然很好奇为什么你不能通过属性选择元素。
    • 哦,你可以通过它的属性来选择一个元素。这里的问题是您的应用程序没有始终如一地应用 aria-required 属性。例如,我在您包含的图像中的项目负责人输入中看不到它。想一想,也许这里有一个产品缺陷,如果对开发人员来说工作量太大(根本不应该!),他们至少应该为他们试图使用的属性做好准备.
    猜你喜欢
    • 2016-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-09
    • 2017-02-27
    • 2019-02-10
    • 2017-02-17
    • 1970-01-01
    相关资源
    最近更新 更多