【发布时间】:2017-07-17 11:17:51
【问题描述】:
我正在尝试在 C# 中使用 Selenium 设置页面工厂模型框架
我已经使用 Selenium 运行了我的测试,但想将我的测试从框架中分离出来。
一些测试要求我在对元素进行任何操作之前等待元素可见。在我的 Selenium 测试的其他版本中,我会做类似
By selector = By.XPath("/html/body/header/div/div[4]/div/div/div[2]/div[1]/form/div[2]/span[2]");
new WebDriverWait(driver.Instance, TimeSpan.FromSeconds(5)).Until(ExpectedConditions.ElementIsVisible(selector));
但是我无法让 Element Is Visible 工作,因此在我的扩展方法(下面的代码)中使用了等待直到可见。
当我运行我的测试时,即使等待可见 Selenium 也不会在继续之前等待元素出现。当我调试测试时,它在 WaitUntilVisible 步骤中出现 stackOverflow 失败。
当我正常运行测试时,我收到消息没有显示错误,但是它正在显示(我可以在屏幕上看到它)。根据在我的替代框架中运行此测试的经验,我知道这仅仅是因为测试在元素出现之前寻找它。
我已经在我的浏览器工厂类中运行 ImplicitWait。
我是否在页面工厂模型中正确理解并使用了我的等待?
测试我正在运行
[Test]
public void Framework_Invalid_Location()
{
BrowserFactory.InitBrowser("Chrome");
BrowserFactory.LoadApplication("xxxxxxxxxxxxxx");
Page.HomePage.SearchForRestaurant("CFYUGHGYHYTDFD");
Assert.That(Page.HomePage.InvalidPostcode(), Is.EqualTo("Please enter a valid location or postcode"), "message does not show");
BrowserFactory.CloseAllDrivers();
}
首页类
private IWebDriver driver;
[FindsBy(How = How.CssSelector, Using = "#js-postcode")]
[CacheLookup]
private IWebElement PostcodeInput { get; set; }
[FindsBy(How = How.XPath, Using = "/html/body/header/div/div[4]/div/div/div[2]/div[1]/form/div[2]/span[2]")]
[CacheLookup]
private IWebElement ErrorMessageInvalidEntry { get; set; }
public void SearchForRestaurant(string Postcode)
{
PostcodeInput.SendKeys(Postcode);
SearchButton.ClickOnIt("SearchButton");
public string InvalidPostcode()
{
ErrorMessageInvalidEntry.WaitUntilVisible(10);
return ErrorMessageInvalidEntry.Text;
}
元素扩展函数我正在等待等待。从 cmets 和建议更新
public static void Wait(this IWebElement element, IWebDriver driver, float TimeOut) {
WebDriverWait Wait = new WebDriverWait(driver, TimeSpan.FromSeconds(TimeOut));
return Wait.Until(ExpectedConditions.ElementIsVisible(element));
(元素)的此代码仍然存在一个错误 无法从 OpenQa.Selenium.IWebElement 转换为 open.Qa.Selenium.By
真的觉得我在过去几个月学到的小知识的边缘,所以谢谢大家的帮助。
页面类
namespace KukdFramework.PageObjects
{
public class Page
{
private static T GetPage<T>() where T : new()
public static HomePage HomePage
{
get { return GetPage<HomePage>(); }
}
浏览器工厂代码
private static readonly IDictionary<string, IWebDriver> Drivers = new Dictionary<string, IWebDriver>();
private static IWebDriver driver;
public static IWebDriver Driver
{
get
{
if (driver == null)
throw new NullReferenceException("The WebDriver browser instance was not initialized. You should first call the method InitBrowser.");
return driver;
}
private set
{
driver = value;
}
}
public static void InitBrowser(string browserName)
{
switch (browserName)
{
case "Firefox":
if (driver == null)
{
driver = new FirefoxDriver();
Drivers.Add("Firefox", Driver);
BrowserSettings();
}
break;
case "IE":
if (driver == null)
{
driver = new InternetExplorerDriver();
Drivers.Add("IE", Driver);
BrowserSettings();
}
break;
case "Chrome":
if (driver == null)
{
driver = new ChromeDriver();
Drivers.Add("Chrome", Driver);
BrowserSettings();
}
break;
}
}
【问题讨论】:
-
几件事,删除不必要的代码,你已经粘贴了这么多不需要的代码。我猜
WaitUntilVisible没有按预期工作,对吧?怎么了。任何错误或异常,或者它不起作用。请更新问题,而不是在评论中回复。 -
我已经更新了帖子,我已经包含了所有代码来尝试显示我的框架的结构。因为这对我来说是全新的,所以我不确定是否有一些基本的我做错了导致这个问题。
-
什么是堆栈跟踪,我不太懂 C#,但似乎
WaitUntilVisible是自定义函数,而不是 webdriver 提供的。你能用WaitUntilVisible和堆栈跟踪的实现来更新问题吗? -
已经根据 Jordans 的评论和我自己意识到的内容修改了我的代码。但是仍然无法让 WebDriverWait 正常工作。
-
我不认为是这样,我认为
WaitUntilVisible是一种重载方法。你应该搜索实现,我也没有看到任何堆栈跟踪。