我是Selenium的新手,经过大量研究,我已经停止了。我已经看到了各种代码,其代码类似于我在下面的代码:
class LoginPage { private IWebDriver driver; public LoginPage(IWebDriver driver) { this.driver = driver; } //HomePage appears when Login successful public HomePage DoLogin(string user, string pass) { driver.FindElement(By.Name("userfield")).SendKeys(user); driver.FindElement(By.Name("passfield")).SendKeys(pass).Submit(); //what is the above fails and i stay on the LoginPage? returning a HomePage object will be a bad idea here HomePage homepage = new HomePage(driver) PageFactory.InitElements(driver, homepage) return homepage; } } class HomePage{ public HomePage(WebDriver driver) { this.driver = driver; } public void clickExitButton() { exitButton.click(); } public LoginPage logout() { clickExitButton(); LoginPage loginpage = new LoginPage(driver) PageFactory.InitElements(driver, loginpage); return loginpage; } }
我的问题:
哪一个课程没有做到他们应该做的事情?如果登录失败怎么办?它仍将返回HomePage对象。情况应该不是这样,对吧?如何应对失败可以做些什么?我见过的大多数例子都假设事情“会”正确地解决。
上述实现对C#是否正确?我见过的大多数示例都是针对Java的 - 只是想将它们转换为C#,因为我知道C#:)
谢谢!
答案 0 :(得分:1)
对于您的第一个问题,我之前解决的方法是在每个页面类中包含一个函数,该函数指示Selenium当前是否在预期的页面上。例如,Homepage
类将具有类似的内容:
public bool IsCurrentPage()
{
try
{
driver.FindElement(By.LinkText("Logout"));
}
catch (Exception)
{
return false;
}
return true;
}
因此,当您创建新的Homepage
时,会立即检查它是否有效:
HomePage homepage = new HomePage(driver);
if (!homepage.IsCurrentPage())
throw new Exception("Invalid homepage object");
然后您可以以任何适合您目的的方式自由处理不匹配。当然该方法可能被欺骗,因此另一个选项是检查页面名称的URL(例如homepage.html)。您对页面检查的严格程度取决于您想要的准确性和灵活性。
对于你的第二个问题,除了一对缺少分号外,代码看起来还不错。
答案 1 :(得分:0)
对于您的第一个问题:如果找不到“userfield”或“passfield”,Selenium将不会返回Homepage对象。
通过使用FindElementBy(...)方法,您隐式假设这些字段必须存在。如果Selenium在页面上找不到“userfield”或“passfield”元素,则会抛出异常。在那里有效地“失败”了测试。
通常,此过程的工作方式是nUnit将启动Integration测试。如果Selenium没有找到继续所需的元素之一,那么特定的Integration测试将失败。
在我看来,这就是为什么尽可能划分集成测试是有益的。确保测试您要确保的行为所涉及的太多很多设置工作正在发挥作用。
我还发现这种扩展方法对于确保页面上不的特定元素非常有用。请记住,此扩展方法属于Selenium“ImplicitWait”时间的牺牲品。这一次调用将有效地 要求 N秒后再继续。
public static class RemoteWebDriverExtensions
{
public static bool ElementDoesNotExist(this RemoteWebDriver driver, By by)
{
try
{
var element = driver.FindElement(by);
return false;
}
catch (Exception)
{
return true;
}
}
}
最终可以这样使用:
driver.ElementDoesNotExist(By.LinkText("Logout"));