按xpath属性查找所有元素(aria-required = true).//* [@aria-required ='true']

时间:2016-03-14 09:33:20

标签: c# selenium xpath selenium-webdriver

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

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

“.//*[@咏叹调-需要= '真']”

从我的研究中,这将意味着它将从我的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属性,但项目负责人却没有。如果我再次检查元素,但这次点击项目负责人。该属性将被加载。很奇怪....

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

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

1 个答案:

答案 0 :(得分:0)

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

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