我整理了以下方法:
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 “,”等“)?
答案 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,即使您检测到第一个突出显示不符合预期,也可以避免获取所有突出显示。