在页面工厂模型中使用 ElementIsVisible
using ElementIsVisible in Page Factory Model
我正在尝试在 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 工作,所以在我的扩展方法(下面的代码)中使用了 Wait Until Visible。
当我 运行 我的测试即使使用 Wait Until Visible Selenium 也不会等待元素出现才继续。当我调试测试时,它在 WaitUntilVisible 步骤中出现 Whosebug 失败。
当我 运行 测试正常时,我收到的消息没有显示错误,但是它显示了(我可以在屏幕上看到它)。我从 运行 在我的替代框架中进行此测试的经验得知,这仅仅是因为测试正在寻找元素出现之前。
我已经 运行将 ImplicitWait 作为我的浏览器工厂 Class 的一部分。
我是否理解并正确使用了页面工厂模型中的等待?
测试我运行宁
[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();
}
首页Class
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;
}
Element Extension函数我正在调用我的Wait。根据评论和建议更新
public static void Wait(此 IWebElement 元素、IWebDriver 驱动程序、float TimeOut)
{
WebDriverWait Wait = new WebDriverWait(driver, TimeSpan.FromSeconds(TimeOut));
return Wait.Until(ExpectedConditions.ElementIsVisible(element));
此代码(元素)仍有一个错误
无法从 OpenQa.Selenium.IWebElement 转换为 open.Qa.Selenium.By
真的觉得我在过去几个月里学到的一点点知识都处于边缘,所以谢谢你的所有帮助。
第Class
页
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()
扩展方法无路可退地递归调用自身。
这会导致堆栈溢出异常
您可以将上面的 WebDriverWait
调用放在此方法中,而不是递归调用此方法,而 return 则找到 IWebElement
.
更新(来自评论):
您还需要传入 WebDriver
实例。在上面的 WebDriverWait
行中,您使用 driver.Instance
。
另一种选择是修改扩展方法以要求 WebDriverWait
的实例,而不仅仅是 float
的等待时间。这样你就不需要自己传递驱动程序对象了。
我不是 C# 程序员,但是 JAVA 和 C# 很相似,因此您可以转换以下 Java 代码。
WaitUntilVisible 应该是这样的
public static void WaitUntilVisible(WebElement element, int timeOut){
WebDriverWait wait = new WebDriverWait(driver, timeOut);
wait.until(ExpectedConditions.visibilityOf(element));
}
我正在尝试在 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 工作,所以在我的扩展方法(下面的代码)中使用了 Wait Until Visible。
当我 运行 我的测试即使使用 Wait Until Visible Selenium 也不会等待元素出现才继续。当我调试测试时,它在 WaitUntilVisible 步骤中出现 Whosebug 失败。
当我 运行 测试正常时,我收到的消息没有显示错误,但是它显示了(我可以在屏幕上看到它)。我从 运行 在我的替代框架中进行此测试的经验得知,这仅仅是因为测试正在寻找元素出现之前。
我已经 运行将 ImplicitWait 作为我的浏览器工厂 Class 的一部分。
我是否理解并正确使用了页面工厂模型中的等待?
测试我运行宁
[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();
}
首页Class
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;
}
Element Extension函数我正在调用我的Wait。根据评论和建议更新
public static void Wait(此 IWebElement 元素、IWebDriver 驱动程序、float TimeOut) {
WebDriverWait Wait = new WebDriverWait(driver, TimeSpan.FromSeconds(TimeOut));
return Wait.Until(ExpectedConditions.ElementIsVisible(element));
此代码(元素)仍有一个错误 无法从 OpenQa.Selenium.IWebElement 转换为 open.Qa.Selenium.By
真的觉得我在过去几个月里学到的一点点知识都处于边缘,所以谢谢你的所有帮助。
第Class
页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()
扩展方法无路可退地递归调用自身。
这会导致堆栈溢出异常
您可以将上面的 WebDriverWait
调用放在此方法中,而不是递归调用此方法,而 return 则找到 IWebElement
.
更新(来自评论):
您还需要传入 WebDriver
实例。在上面的 WebDriverWait
行中,您使用 driver.Instance
。
另一种选择是修改扩展方法以要求 WebDriverWait
的实例,而不仅仅是 float
的等待时间。这样你就不需要自己传递驱动程序对象了。
我不是 C# 程序员,但是 JAVA 和 C# 很相似,因此您可以转换以下 Java 代码。
WaitUntilVisible 应该是这样的
public static void WaitUntilVisible(WebElement element, int timeOut){
WebDriverWait wait = new WebDriverWait(driver, timeOut);
wait.until(ExpectedConditions.visibilityOf(element));
}