遍历对象属性IWebElement

时间:2020-06-14 22:20:01

标签: c# selenium lambda

我正在使用 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对象的方式遍历对象的属性?

1 个答案:

答案 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);