自动测试会从安装程序中列出的代码中引发错误,尽管该代码已在其他测试中正确执行

时间:2019-02-11 11:24:28

标签: c# selenium automated-tests ui-automation

我从一组测试中收到一个错误,尽管该方法已经在执行,但似乎正在寻找Setup方法中列出的元素,抛出的错误是:

  

消息:OpenQA.Selenium.NoSuchElementException:没有这样的元素:无法找到元素:{“ method”:“ xpath”,“ selector”:“ // input [@ id ='txtCompany']”}}
    (会话信息:chrome = 71.0.3578.98)
    (驱动程序信息:chromedriver = 2.45.615291
   (ec3682e3c9061c10f26ea9e5cdcf3c53f3f74387),platform = Windows NT 10.0.17763 x86_64)“

我尝试替换并注释掉代码,还添加了返回“启动”屏幕的额外步骤,然后单击“报告”下拉菜单,但这并未解决问题。类似的代码可以在进行其他测试的此类外部正常工作。

using System;
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using NUnit.Framework;


[SetUp]
public void initalise()
    {   
driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10);
        driver.Manage().Window.Maximize();

        //Navigates to the Test DB
        driver.Url = "https://TESTWEBSITE.co.uk";
        driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10);
        //Find Company Text Box and send company name

driver.FindElement(By.XPath("//input[@id='txtCompany']")).SendKeys("COMPANY");

        //Find username Text Box and send username

driver.FindElement(By.XPath("//input[@id='txtUsername']")).SendKeys("6969_1");

        //Find password and send

driver.FindElement(By.XPath("//input[@id='txtPassword']")).SendKeys("PASSWORD");

        //Find Login button and click
        driver.FindElement(By.XPath("//input[@id='cmdLogin']")).Click();
    }

  [Test, Order(1)]
    public void reportsStandard()
    {
        driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10);
        driver.FindElement(By.XPath("//span[@class='rpOut']//span[@class='rpText'][contains(text(),'Reports')]")).Click();
        driver.FindElement(By.XPath("//span[contains(text(),'Standard Reports')]")).Click();

        IWebElement ReportType = driver.FindElement(By.XPath("//div[@id='ctl00_ContentPlaceHolder_lstReports']//ul[@class='rlbList']"));
        Assert.AreEqual(true, ReportType.Displayed);

    }
   [Test, Order(2)]
  public void reportsPandLCustomer()
    {

        driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10);
        driver.FindElement(By.XPath("//span[contains(text(),'Home')]")).Click();
        driver.FindElement(By.XPath("//span[@class='rpOut']//span[@class='rpText'][contains(text(),'Reports')]")).Click();
        driver.FindElement(By.XPath("//span[contains(text(),'Profit and Loss by Customer')]")).Click();

        IWebElement AdvancedFiltering = driver.FindElement(By.XPath("//a[@id='ContentPlaceHolder_cmdAdvancedFiltering']"));
        Assert.AreEqual(true, AdvancedFiltering.Displayed);
    }

我希望测试的执行方式为:

  

设置(启动浏览器>转到网站>登录)
  测试订单1(点击报告下拉菜单>点击标准报告)
  测试订单2(单击“主页”按钮>单击“报告”下拉列表>“ ProfitAndLoss”按钮)

实际结果是:

  

设置-通过,
  测试订单1-通过,
  测试订单2-失败-错误无法找到仅在设置方法期间使用的元素。

2 个答案:

答案 0 :(得分:2)

因此,在玩耍和谷歌搜索之后,如果将类的[Setup]方法更改为[OneTimeSetup],则此方法可以正常工作。新代码如下所示:

[OneTimeSetUp]
    public void initalise()
    {  //Maximise Window
        driver.Manage().Window.Maximize();

        //Navigates to the NG Test DB
        driver.Url = "https://TESTWEBSITE.co.uk";
        driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10);
        //Find Company Text Box and send company name
        driver.FindElement(By.XPath("//input[@id='txtCompany']")).SendKeys("CompanyName");

        //Find username Text Box and send username
        driver.FindElement(By.XPath("//input[@id='txtUsername']")).SendKeys("6969_1");

        //Find password and send
        driver.FindElement(By.XPath("//input[@id='txtPassword']")).SendKeys("Password!");

        //Find Login button and click
        driver.FindElement(By.XPath("//input[@id='cmdLogin']")).Click();
    }
 [Test, Order(1)]
    public void reportsStandard()
    {
        driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10);
        driver.FindElement(By.XPath("//span[@class='rpOut']//span[@class='rpText'][contains(text(),'Reports')]")).Click();
        driver.FindElement(By.XPath("//span[contains(text(),'Standard Reports')]")).Click();
        IWebElement ReportType = driver.FindElement(By.XPath("//div[@id='ctl00_ContentPlaceHolder_lstReports']//ul[@class='rlbList']"));
//Assert.AreEqual(true, ReportType.Displayed);
    }
    [Test, Order(2)]
    public void reportsPandLCustomer()
    {

        driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10);
        driver.FindElement(By.XPath("//span[contains(text(),'Home')]")).Click();
        driver.FindElement(By.XPath("//span[@class='rpOut']//span[@class='rpText'][contains(text(),'Reports')]")).Click();
        driver.FindElement(By.XPath("//span[contains(text(),'Profit and Loss by Customer')]")).Click();

        IWebElement AdvancedFiltering = driver.FindElement(By.XPath("//a[@id='ContentPlaceHolder_cmdAdvancedFiltering']"));
        Assert.AreEqual(true, AdvancedFiltering.Displayed);
    }
    [Test, Order(3)]
    public void reportsPandLPhone()
    {
        driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10);
        driver.FindElement(By.XPath("//span[contains(text(),'Home')]")).Click();
        driver.FindElement(By.XPath("//span[@class='rpOut']//span[@class='rpText'][contains(text(),'Reports')]")).Click();
        driver.FindElement(By.XPath("//span[contains(text(),'Profit and Loss by Phone Number')]")).Click();
        IWebElement ResetBTN = driver.FindElement(By.XPath("//span[@id='ctl00_FunctionBarPlaceHolder_cmdReset']"));
        Assert.AreEqual(true, ResetBTN.Displayed);
    }

答案 1 :(得分:1)

标记为[SetUp]的方法在每次测试之前运行,请参见docs

我认为问题是这样的:

  1. 安装程序运行,登录您
  2. Test1运行并通过
  3. 由于Test1已完成,因此安装程序将再次运行,但是由于您正在重复使用浏览器会话(或者至少显示了已发布的代码),因此这次您已经登录,因此在Setup方法中查找Company字段时,不在那里。

最佳做法是每个测试使用一个浏览器会话。它确保您每次都能获得最干净的运行。您需要将启动浏览器添加到[SetUp]方法中,并且需要添加[TearDown]方法以退出浏览器。这是您的测试应如何运行:

  1. 安装程序运行,启动浏览器并登录您
  2. Test1运行并通过
  3. TearDown运行并关闭浏览器
  4. 安装程序运行,启动浏览器并登录您
  5. Test2运行并通过
  6. TearDown运行并关闭浏览器

您的TearDown方法应该类似于(请参阅上面的文档)

[TearDown]
public void Cleanup()
{
    driver.Quit();
}

注释1:

driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10);

这实际上并不等待...它设置了driver实例的等待时间。只需设置一次即可,除非您要将超时更改为其他值,否则不应再次使用它。您可以删除此实例的所有实例,但第一个实例应该位于Setup方法中。

注释2: 硒贡献者已声明避免使用ImplicitWait。您应该改用WebDriverWait

注释3: 您的测试不应以特定顺序运行。每个测试都应该彼此独立,并且应该能够以任何顺序运行。