如何找到与CssSelectors匹配的两个元素的父元素?

时间:2019-04-04 20:06:24

标签: c# selenium selenium-webdriver

给出以下(通用)动态HTML结构:

<ol id="myOrderedList">
    <li id="someGuidICantPredict">
        <span data-serial="someData1">someData1</span>
        <span data-manufacturer="someDataB1">someDataB1</span>
    </li>
    //(repeated many times with different data)
</ol>

我如何找到以下内容:

<li>中找到data-serialdata-manufacturer都由CssSelector匹配的范围吗?

我知道如何对一个或另一个span标签执行此操作:

By.CssSelector($"#olCurrentTanks li span[data-serial={serial1}]")

By.CssSelector($"#olCurrentTanks li span[data-manufacturer={manufacturer1}]")

但是我不知道如何找到两者都匹配的父<li>元素。这意味着我需要获取IWebElement listItem,其中两个跨度的数据属性都与我可以预测的相应数据相匹配。

编辑:难度:可以使用x路径获取li父对象,但不查找跨度。

1 个答案:

答案 0 :(得分:1)

使用,您可以获得带有特定li个孩子的span元素:

//li[./span[@data-serial="someData1"] and ./span[@data-manufacturer="someDataB1"]]

下面的选择器将为li提供所有FindElements元素作为列表,为FindElement提供单个第一个元素:

By.XPath("//li[./span[@data-serial='someData1'] and ./span[@data-manufacturer='someDataB1']]")

代码示例:

IList<IWebElement> allMyLi = driver.FindElements(By.XPath($"//li[./span[@data-serial='{serial1}'] and ./span[@data-manufacturer='{manufacturer1}']]"));

foreach (var myLi in allMyLi)
{
    IWebElement serial = myLi.FindElement(By.CssSelector($"span[data-serial={serial1}]"));
    IWebElement manufacturer = myLi.FindElement(By.CssSelector($"span[data-manufacturer={manufacturer1}]"));

    Console.WriteLine("serial, manufacturer: {0}, {1}", serial.Text, manufacturer.Text);
}