【发布时间】: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