我想知道如何为以下内容创建xpath,我需要点击Test2,然后打开一个新窗口。
<div class="example">
<a href="#" onclick="parent.navigateFrame('../test/test.aspx', 'Test2'); return false;" target="_self">
<h1>Test2</h1>
</a>
<p></p>
</div>
我是这一切的新手,所以需要一段时间来弄清楚如何形成xpath。 我尝试了以下方法但没有成功。
(1) xpath(//*[contains(@class, 'example' and @onclick, 'Test2')]
(2) xpath(//*[contains(@class, 'example' and @onclick, 'parent.navigateFrame('../test/test.aspx', 'Test2')')])
有人可以帮帮我吗?
谢谢
答案 0 :(得分:2)
这个表达式:
//div[@class='example']/a
有两个步骤(由/
分隔)。第一个将选择div
,其class
属性包含文本example
。最后一个(您想要的元素)将选择a
中的所有div
元素。
要获取第一个 a
元素,您可以添加谓词:
//div[@class='example']/a[1]
这是位置谓词。根据您的尝试,您需要对谓词检查其他内容,例如onclick
属性中的值。在这种情况下,您应该使用:
//div[@class='example']/a[contains(@onclick, 'Test2')]
如您所见,第一个谓词用于限制div
。诸如//div
之类的表达式会在您的文件中选择所有 div
。谓词限制了这一点。 [@class='example']
将该集合缩减为div
的集合,其中class属性包含'example'
。
但你不想要div
。您需要a
才能点击。所以现在再继续一步。除非您在路径前添加parent::
或following::
之类的内容,否则您使用的是child::
轴,即默认。这意味着每个步骤将向下移动到树节点。由于a
是div
的孩子,因此您可以使用div/a
(与child::div/child::a
相同)。同样,它会在上下文中选择所有 a
元素,因此您需要再次使用a
元素的一个或多个谓词进行限制。 / p>
如果 example
中除了div
之外可能还有其他类,您可以使用contains()
(例如:<div class="some-class example some-other-class">
,但请注意它可能比您期望的更多(example-1
,my-example
也会匹配contains(@class, 'example')
。