找不到具有动态ID的元素

时间:2019-02-18 12:25:06

标签: selenium-webdriver

我正在为我正在从事的项目使用Selenium创建一些测试。由于某种原因,我无法使用其id,class,xpath等定位元素。也许我做错了什么。登录到应用程序后,页面如下所示:

After I login

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

        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();

My project button after I create the project

1 个答案:

答案 0 :(得分:0)

我建议使用两个

from math import sqrt 
def isprime(n):
    for i in range(2,int(n**0.5)+1):
        if n%i==0:
            return False
    return True

def primesquare(l):
    flag=0
    if len(l)==1:
        n=l[0]
        if(sqrt(n)%1==0):
            return True
    else:
        for i in range(0,len(l)):
            if(sqrt(l[i])%1==0):
                if(i==0):
                    if(isprime(l[i+1])==True):
                        flag=1
                    else:
                        if(isprime(l[i-1])==True):
                            if(isprime[i+1]==True):
                                flag=1
                            else:
                                flag=0
                        else:
                            flag=0

    if(flag==0):
        return False
    else:
        return True

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