selenium-webdriver - 无法找到具有动态 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();
解决方案
我建议使用两个
IList<IWebElement>
一个带有项目名称,第二个带有元素,您可以单击它们。然后,您可以在第一个列表上进行迭代,以获取需要项目的行数。然后使用第二个列表单击此项目。
推荐阅读
- r - RMarkdown 和文章中的德语变音符号
- grails - Cron 表达式被多次调用
- python - pip-req-build 临时文件夹的用途是什么?我可以阻止使用它吗?
- kubernetes - Kubernetes - 流量总是重定向到同一个 pod
- java - 使用非主键列的休眠连接
- sql - 变量具有撇号时的字符串生成器 SELECT 查询
- android - 错误:(1, 0) 插件太旧,请更新到更新版本,或设置 ANDROID_DAILY_OVERRIDE "e71316b1598b09073ff04c4315280c3b0e755860"
- fortran - 在 Fortran 中混合整数类型
- python - 使用上下文管理器临时覆盖语言环境
- php - 需要在 fopen、file_get_contents 和 fread 等 php 函数上设置 Timeout