将值传递给Xpath表达式

时间:2015-10-28 17:22:05

标签: c# xpath selenium-webdriver

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

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:无法转换表达式以返回指定的类型。

2 个答案:

答案 0 :(得分:0)

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

相反,你可能意味着:

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

请注意,XPath中的索引以1开头 - 请确保您确实获得了正确的项目。

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

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

答案 1 :(得分:0)

假设“item container”是一个DIV标签,如果不是div用正确的标签替换div,*也会起作用,但是你可能会得到更多你不想要的元素。

试试这个:

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

用项目索引替换1。