如何告诉代码在两个变量之间进行选择并使它们相等

本文关键字:选择 行选 之间 变量 代码 何告诉 两个 | 更新日期: 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
}