将参数分配给列表

时间:2019-05-01 05:46:08

标签: c# linq

我整理了以下方法:

public static bool compareTableRow(List<string> expected,  int rowNumberOfElemets, IWebDriver driver)
    {
        List<string> actual = new List<string>
        { };

        for (int i = 1; i < rowNumberOfElemets + 1; i++)
        {
            actual.Add(driver.FindElementHighlight
              (By.XPath("//*[@id=\"nefi-content\"]/div[2]/section/div/table/tbody/tr[1]/td[" + i + "]/div/input")).GetAttribute("value"));
        }

        if (expected.SequenceEqual(actual)) return true;
        else
            return false;
    }

目前,“预期”列表已经过硬编码。我应该将哪种方法变量作为输入,以便能够调用该方法并传递我要比较的字符串(“ bla1”,“ 123”,“ bla2”,“ etc “,”等“)?

2 个答案:

答案 0 :(得分:2)

即使在实现时也不需要对expected参数进行硬编码,也很容易这样调用您的方法:

compareTableRow(new List<string> {"bla1", "123", "bla2", "etc", "etc"}, 42, driver);

或者,您可以使用params关键字(https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/params):

public static bool compareTableRow(int rowNumberOfElemets, IWebDriver driver, params string[] expected)
{
    ...
}

并按照您的描述进行调用:

compareTableRow(42, driver, "bla1", "123", "bla2", "etc", "etc");

答案 1 :(得分:0)

因此,您有一个IWebDriver,它具有许多行的概念。您还会有一个输入rowNumberOfElements和一个期望的字符串列表。

您要检查rowNumberOfElements中可以FindByElementHighlight进行的前IWebDriver个项目是否与预期字符串列表完全相同。

我在这里看到了几个问题:

首先:预期字符串列表中的顺序重要吗?那么第一个预期字符串应该等于第一个FindByElementHighLight吗?根据您的代码,顺序很重要。

此外:预期字符串列表是否足够长?它可以长于rowNumberElements,或者通常足够长,并且可以将rowNumberElements替换为期望列表中的元素数量吗?

如果第一个元素不匹配,则您将无法检查其他元素,因为您已经知道返回值将为false。

通用解决方案

我将使用它来编写它作为IWebDriver的扩展方法。就像您问IWebDriver:您的前X个元素是否等于此序列的前X个元素?参见extension methods demystified

static bool HasExpectedHighLights(this IWebDriver driver, ICollection<string> expected)
{
      // TODO: driver == null? expected == null?
      return driver.HasExpectedHighLights(expected, expected.Count);
}
static bool HasExpectedHighLights(this IWebDriver driver,
   IEnumerable<string> expected, int nrOfElements)
{
    // TODO: driver == null? expected == null? nrOfElements < 0?
    your code goes here
}

首先,我们将显示用法:

List<string> expectedHighLights = ...
IWebDriver driver = ...
var isExpected = driver.HasExpectedHighLights(expectedHighLights);

但是在某些LINQ语句中间也可以使用:

IEnumerable<image> images = ...
var imagesWithExpectedHighLights = images
    .Where(image => image.Driver.HasExpectedHighLights(expectedHighLights))
    .Slect(image => ...);

现在是代码。最重要的是,我们应该尽快停止。

static string FindElementHighLight(this IWebDriver driver, int i)
{
     return driver.FindElementHighlight(By.XPath("//*[@id=\" ... etc);
}

static bool HasExpectedHighLights(this IWebDriver driver,
   IEnumerable<string> expected, int nrOfElements)
{
    // TODO: exception if driver == null? expected == null? nrOfElements < 0?

    IEnumerable<string> actualHighLights = driver
        .Select( (driver,  i) => driver.FindElementHighLight(i)
        .Take(nrOfElements);
    // note: this has only created the enumerable.
    // The sequence has not been enumerated yet

    return actualHighLights.SequenceEqual(expected);
    // sequence equal will stop as soon as a mismatch has been found      
}

因此,如果在i == 3处发现不匹配,则不会计算HighLight(4)。

令人高兴的是,在不更改IWebDriver的情况下,您为其添加了功能:FindElementHighLight(int)。

这可用于在SequenceEqual中创建IEnumerable,即使您检测到第一个突出显示不符合预期,也可以避免获取所有突出显示。