首页 > 解决方案 > 无法找到具有动态 ID 的元素

问题描述

我正在为我正在工作的项目使用 Selenium 创建一些测试。出于某种原因,我无法找到具有其 id、类、xpath 等的元素。也许我做错了什么。登录应用程序后,页面如下所示:

我登录后

如果您看到 3 个选项卡:收藏夹、我的项目、所有项目,它们的 ID 分别为 12、13、14。当我单击“添加项目”按钮并单击“创建”时,会添加一个新项目,并且该项目位于“我的项目”下。所以我的目的是在创建这个项目后点击“我的项目”按钮,然后点击新项目的名称并编辑它,这样我就可以进行一些修改并继续我的测试。问题是当我尝试单击“我的项目”按钮时,我不能,它说这个属性不能被单击。添加新项目后,上述三个按钮的 ID 也会发生变化。所以“收藏夹”现在 ID=15,“我的项目”ID=16,“所有项目”ID=17。任何人都可以帮助并让我知道找到这样的元素的正确方法是什么?我尝试了不同的东西,但到目前为止没有任何效果。下面是我的测试中的代码和带有元素检查的屏幕截图。提前感谢您,任何帮助将不胜感激。

        driver.FindElement(By.Id("UserName")).Click();
        driver.FindElement(By.Id("UserName")).Clear();
        driver.FindElement(By.Id("UserName")).SendKeys("admin");
        driver.FindElement(By.XPath("(.//*[normalize-space(text()) and normalize-space(.)='Login'])[3]/following::table[1]")).Click();
        driver.FindElement(By.Id("Password")).Click();
        driver.FindElement(By.Id("Password")).Clear();
        driver.FindElement(By.Id("Password")).SendKeys("admin");
        driver.FindElement(By.XPath("(.//*[normalize-space(text()) and normalize-space(.)='Password'])[1]/following::input[2]")).Click();
        driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(30);
        driver.FindElement(By.Id("addproject-button")).Click();
        driver.FindElement(By.Id("Name")).Click();
        driver.FindElement(By.Id("Name")).Clear();
        driver.FindElement(By.Id("Name")).SendKeys("ProjectX");
        driver.FindElement(By.Id("Comments")).Click();
        driver.FindElement(By.Id("Comments")).Clear();
        driver.FindElement(By.Id("Comments")).SendKeys("the project");
        driver.FindElement(By.Id("addproject")).Click();
        driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(30);
        //****************** THIS IS WHERE MY TEST FAILS-IT CAN'T LOCATE THE ELEMENT BY.ID*****************
          driver.FindElement(By.XPath("//li[@class='ui-state-default ui-corner-top']/a[contains(.,'My projects')]")).Click();
        //driver.FindElement(By.Id("ui-id-16")).Click();
        //driver.FindElement(By.CssSelector("a.ui-tabs-anchor[id='ui-id-16']")).Click();

//driver.FindElement(By.Id("ProjectListTable")).FindElement(By.Id("project-list-tabs-content")).Click();//FindElement(By.ClassName("ui-state-default.ui-corner-top.ui-tabs-active.ui-state-active")).Click();
        //driver.FindElement(By.ClassName("ui-tabs-anchor")).Click();

创建项目后我的项目按钮

标签: selenium-webdriver

解决方案


我建议使用两个

IList<IWebElement>

一个带有项目名称,第二个带有元素,您可以单击它们。然后,您可以在第一个列表上进行迭代,以获取需要项目的行数。然后使用第二个列表单击此项目。


推荐阅读