【问题标题】:C# webdriver - how do I discover an xpath from a known element classname?C# webdriver - 如何从已知元素类名中发现 xpath?
【发布时间】:2011-08-28 08:39:45
【问题描述】:

我正在测试一个具有“帐户”页面的网站,该页面显示可用订阅级别的表格,其中列标题是不同类型的帐户,行列出所有功能以及哪些功能在什么级别可用。例如:

          fanboy       poweruser     neophyte     freeloader
Widgets   1,000        500           250          100
Doodads     750        350           100          100
Thingies    500        250           100           50
          [UPGRADE]    [UPGRADE]     [UPGRADE]    Your Plan  

这一切都是作为嵌套div 元素完成的,具有唯一的类名,因此通过相应的类名查找特定单元格非常简单。例如:

var yourPlan = driver.FindElement(By.ClassName("your_plan"));  

如果我已经知道的话,我还可以通过它们的 XPath 找到特定的单元格。例如:

var yourPlan = driver.FindElement(By.XPath(".//div[@class='your_plan']"));  

但有时我需要通过类名来发现我找到的单元格的 xpath,而在 Webdriver (C#) 中似乎没有一种简单的方法可以做到这一点。以前有人做过吗?


编辑: 向所有人道歉,因为对此没有更清楚:我在通过类名或其他属性(甚至是 xpath,当我已经知道时)查找元素时没有任何问题。但是我需要的是,一旦通过 xpath 以外的方式找到所述元素,webdriver 就可以向我报告它找到的完整 xpath。

希望对您有所帮助。

任何帮助表示赞赏。 谢谢 格雷格

【问题讨论】:

  • 我不肯定,但我相信 XmlElement(和/或 XmlNode)实例会知道它们的父级,因此您应该能够编写一个简单的例程来返回根并构造它们xpath(我假设标签中的 C#)。在找到父节点后,它需要扫描该父节点的子节点,直到找到它所在的节点,同时计算具有相同元素名称的先前兄弟节点的数量,以便在何时包括索引(例如“[2]”)需要。
  • 有趣的想法。 Webdriver 确实通过 PageSource 提供了原始 html,所以也许我可以将它提供给 C# xml 对象。
  • 哦,顺便说一句,它可能需要对 HTML 进行一些广泛的清理才能使其可解析 XML。我最近参与了一个项目,其中执行清理的代码已经完成,我忘记了在将其加载到 XmlDocument 对象之前是必要的(除非你正在使用的东西已经这样做了;我不熟悉硒) .在你的情况下,编写你自己的简单上下文扫描器来跟踪有效的当前 Xpath 可能更容易,因为它扫描 HTML 直到它到达所需的位置(假设你可以从你已经知道的内容中识别它)。不管怎样,祝你好运。

标签: c# xpath webdriver selenium-webdriver


【解决方案1】:

Selenium 没有任何方法可以为您提供这些信息。虽然有一些工具可以为给定元素生成 XPath(想到 Firefox 的 Firebug 和 XPather 插件),但这不是 Selenium 提供的功能。我希望我能为您提供更好的答案,但答案是否定的,Selenium 不会为您提供您通过其他方式找到的元素的 XPath。

【讨论】:

  • 谢谢,吉姆。我很感激你的回应。我将尝试使用 PageSource 作为 C# XML 对象的输入来拼凑一些东西,其中选项是无限的:)
【解决方案2】:

只需使用以下内容创建 XPath 表达式字符串:

"//div[@class='" + className + "']"

如果类名确实是唯一的,则此 XPath 表达式将仅找到该 div。如果您不知道该元素是 div 还是其他内容,请使用

"//*[@class='" + className + "']"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-08
    • 1970-01-01
    相关资源
    最近更新 更多