将值传递到Xpath表达式中

本文关键字:表达式 Xpath 值传 | 更新日期: 2023-09-27 18:19:36

我目前正在编写一个针对电子商务网站的测试。当用户对特定产品进行搜索时,将返回项目列表。我希望做的是将一个特定的值(例如数字2)传递到我的测试场景中,此时可以将该值传递到XPath表达式(第n个子项)中,从而可以选择该项。

XPath不正确,不知道如何修复。如果有人能帮忙,我将不胜感激。

   [Then(@"I select item '(.*)' from the search results")]
    public static void WaitAndSelectAnItem(int item)
    {
        {
            Driver.Instance.FindElements(By.CssSelector("#productGrid"));
            var itemToSelect = Driver.Instance.FindElement(By.XPath(string.Format("//@class='itemContainer:nth-child({0})'", item)));
            itemToSelect.Click();
        }
    }

结果消息:给定的选择器//@class='itemContainer:nth child(3)'无效或未生成WebElement。出现以下错误:InvalidSelectorError:由于以下错误,无法找到具有xpath表达式//@class='itemContainer:nth child(3)'的元素:TypeError:无法转换表达式以返回指定的类型。

将值传递到Xpath表达式中

nth-child不是XPath语言的一部分,实际上是一个CSS选择器伪类。

相反,你的意思可能是:

(//*[@class='itemContainer'])[{0}]

请注意,XPath中的索引从1开始,确保您实际上得到了正确的项。


或者,您可以使用findElements()查找所有"itemContainers",然后通过索引获得所需的一个。请注意,此处为0索引:

Driver.Instance.FindElements(By.XPath("//*[@class='itemContainer']"))[item]

假设"项目容器"是一个div标记,如果不是div,用正确的标记替换div,*也会起作用,但可能会得到更多你不想要的元素。

试试这个:

(//div[@class='itemContainer'])[1]

将1替换为项目索引。