我正在使用 C#,硒和页面对象模型方法来测试网站。
我有一个页面对象,其中包含IWebElement
个属性列表,这些属性与要迭代的网站中的按钮和链接相对应。
页面对象看起来像:
using System;
using OpenQA.Selenium;
using OpenQA.Selenium.Support.UI;
namespace UITesting
{
class PlansPage
{
private IWebDriver _driver;
public PlansPage(IWebDriver driver)
{
_driver = driver;
}
// Top Navbar
public IWebElement homeButton => _driver.FindElement(By.ClassName("navbar-brand"));
public IWebElement licenseLink => _driver.FindElement(By.XPath("//a[@href='/#/account'][@class='ng-binding']"));
public IWebElement plansLink => _driver.FindElement(By.XPath("//a[@href='#/plans']"));
}
}
在测试中,我可以直接访问每个IWebElement
:
using System;
using OpenQA.Selenium;
using OpenQA.Selenium.Support.UI;
using OpenQA.Selenium.Firefox;
namespace UITesting
{
class PlansTest
{
// Setting up driver & plans page
IWebDriver driver = new FirefoxDriver();
PlansPage plansPage = new PlansPage(driver);
// Accessing IWebElements directly works
plansPage.homeButton.Click();
plansPage.licenseLink.Click();
plansPage.plansLink.Click();
}
}
我希望单击页面上的每个按钮。为此,我希望遍历IWebElements
中的plansTest
并大致像这样在每个元素上运行Click()
:
foreach (IWebElement element in plansPage)
{
element.Click();
}
我能够通过将元素视为属性来遍历元素,这使我可以打印出属性名称:
foreach (var property in plansPage.GetType().GetProperties())
{
Console.WriteLine(property.Name);
}
但是,尝试执行property.Click()
会出现以下错误:
`PropertyInfo` does not contain a definition for `Click` and no accessible extension method `Click` accepting a first argument of type `PropertyInfo` could be found (are you missing a using directive or an assembly reference ?) [UITesting]csharp(CS1061)
似乎GetProperties()
返回一个PropertyInfo
类型的对象,而不返回IWebElement
属性对象本身。
我可以通过将for循环更改为:
foreach (var property in plansPage.GetType().GetProperties())
{
var element = property.GetValue(plansPage, null);
Console.WriteLine(element);
}
然后打印出诸如:
的元素列表Element (id = 8603e77b-2547-47c0-b5f9-1ea44aa214a2)
Element (id = adf114ff-309f-4534-a224-171369e09921)
Element (id = 1027eb75-7001-4dd4-a50f-1c380bfec3a7)
如果我尝试按如下方式将该值分配给IWebElement
元素:
foreach (var property in plansPage.GetType().GetProperties())
{
var temp = property.GetValue(plansPage, null);
IWebElement element = temp;
Console.WriteLine(element);
}
我收到以下错误:
Cannot implicitly convert type 'object' to 'OpenQA.Selenium.IWebElement'. An explicit conversion exists (are you missing a cast?)
我可以告诉我我在这里很近,但是我不知道自己在做什么错。
如何以返回IWebElement
对象的方式遍历对象的属性?
答案 0 :(得分:0)
首先,请介意为什么您需要单击页面上的每个按钮?也许有一种更好的方式来实现您想要的目标。
关于您的问题,您缺少明确的演员表。一种方法是典型的强制转换,将抛出异常是无法强制转换的:
var temp = property.GetValue(plansPage, null);
IWebElement element = (IWebElement) temp;
Console.WriteLine(element);
第二种方法是使用安全类型转换,在失败的情况下返回null(如果类型可以为null):
var temp = property.GetValue(plansPage, null);
IWebElement element = temp as IWebDriver;
Console.WriteLine(element);