如何告诉代码在两个变量之间进行选择并使它们相等
本文关键字:选择 行选 之间 变量 代码 何告诉 两个 | 更新日期: 2023-09-27 18:28:06
我正在进行单元测试,测试平台是一个动态网站,因此CSS Selector和xpath经常更改。所以我想也许我可以同时使用CSS和xpath来检索相同的文本。
我现在面临的主要问题是如何告诉代码等于检索到的两个字符串,就像这样,如果xpath失败也没关系,CSS选择器仍然可以工作,反之亦然。
这是一个简单的代码
string text1 = _driver.FindElement(By.XPath("xpathtext")).Text;
string text2 = _driver.FindElement(By.CssSelector("csstext")).Text;
text1 = text2;
//then use text1 or text2
有什么干净整洁的方法吗?
IWebElement element1 = driver.FindElementIfExists(By.XPath("xpathtext"));
IWebElement element2 = driver.FindElementIfExists(By.CssSelector("csstext"));
string value = (element1 != null ? element1.Text : (element2 != null ? element2.Text : null));
它依赖于FindElementIfExists扩展方法。这只是在你的项目中创建这个类的问题:
public static class WebDriverExtensions
{
public static IWebElement FindElementIfExists(this IWebDriver driver, By by)
{
IWebElement result = null;
try
{
result = driver.FindElement(by);
}
catch { }
return result;
}
}
利用LINQ不一定更短或更干净,但可能更通用。我使用FindElement
而不是FindElements
,因为后者更适合于计划不查找元素的情况,因为它将返回一个空列表,而不是抛出异常:
var driver = new ChromeDriver();
driver.Navigate().GoToUrl("http://stackoverflow.com/");
// setup an array with all needed
// By instances, you can mix and match
var byList = new [] {
By.CssSelector(".categories"),
By.XPath("//body/noscript"),
By.Id("sidebar"),
By.ClassName("module")
};
// do a SelectMany and use FindElements
// instead of FindElement
// take the first
var match = (from byItem in byList
from elements in driver.FindElements(byItem)
select elements).FirstOrDefault();
// if we have a null none of the
// By operators did return an element
if (match != null)
{
// do what ever you need to do if match is not null
}
else
{
// none of your search terms was found
}