我从一组测试中收到一个错误,尽管该方法已经在执行,但似乎正在寻找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-失败-错误无法找到仅在设置方法期间使用的元素。
答案 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。
我认为问题是这样的:
最佳做法是每个测试使用一个浏览器会话。它确保您每次都能获得最干净的运行。您需要将启动浏览器添加到[SetUp]
方法中,并且需要添加[TearDown]
方法以退出浏览器。这是您的测试应如何运行:
您的TearDown方法应该类似于(请参阅上面的文档)
[TearDown]
public void Cleanup()
{
driver.Quit();
}
注释1:
driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10);
这实际上并不等待...它设置了driver
实例的等待时间。只需设置一次即可,除非您要将超时更改为其他值,否则不应再次使用它。您可以删除此实例的所有实例,但第一个实例应该位于Setup方法中。
注释2:
硒贡献者已声明避免使用ImplicitWait
。您应该改用WebDriverWait
。
注释3: 您的测试不应以特定顺序运行。每个测试都应该彼此独立,并且应该能够以任何顺序运行。