【问题标题】:Passing a value into an Xpath expression将值传递给 Xpath 表达式
【发布时间】:2015-10-28 17:22:04
【问题描述】:

我目前正在编写针对电子商务网站的测试。当用户搜索特定产品时,将返回项目列表。我希望做的是将一个特定的值(例如数字 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: Unable to locate an element with the xpath expression //@class='itemContainer:nth-child(3)' 因为以下错误: TypeError:无法将表达式转换为返回指定的类型。

【问题讨论】:

    标签: c# xpath selenium-webdriver


    【解决方案1】:

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

    相反,您的意思可能是:

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

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


    或者,您可以使用findElements() 查找所有“itemContainers”,然后通过索引获取所需的一个。注意这里是 0-indexed:

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

    【讨论】:

      【解决方案2】:

      假设“项目容器”是一个 DIV 标签,如果不是 div 用正确的标签替换 div,* 也可以,但可能会得到更多不想要的元素。

      试试这个:

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

      将 1 替换为您的项目索引。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-25
        • 1970-01-01
        • 2010-11-14
        • 1970-01-01
        相关资源
        最近更新 更多