我正在研究现有 Web 应用程序的自动化测试。我在尝试通过 XPath 选择某些文档节点时遇到了以下问题。
在特定屏幕上,应用程序显示一个带有五个选项卡的选项卡控件。此选项卡控件背后的原始 HTML 如下:
<ul class="tab_set-tabs">
<span id="forTab">
<li class="tab_set-tabSelectionAware">
<a href="javascript:void(0);" id="tabOption_tabSet1">
<strong id="tabOption_tabSet1" class="">
Vendor
</strong>
</a>
</li>
</span><span id="forTab_0">
<li class="tab_set-tabSelectionAware">
<a href="javascript:void(0);" id="tabOption_tabSet2">
<strong id="tabOption_tabSet2" class="">
Ship To
</strong>
</a>
</li>
</span><span id="forTab_1">
<li class="tab_set-tabSelectionAware">
<a href="javascript:void(0);" id="tabOption_tabSet3">
<strong id="tabOption_tabSet3" class="">
Comments
</strong>
</a>
</li>
</span><span id="forTab_2">
<li class="tab_set-tabSelectionAware">
<a href="javascript:void(0);" id="tabOption_tabSet4">
<strong id="tabOption_tabSet4" class="">
Custom
</strong>
</a>
</li>
</span><span id="forTab_3">
<li class="tab_set-tabSelectionAware">
<a href="javascript:void(0);" id="tabOption_tabSet5">
<strong id="tabOption_tabSet5" class="">
History
</strong>
</a>
</li>
</span>
</ul>
如您所见,有 5 个同级“跨度”节点,每个节点代表 5 个选项卡之一。然而,当我在 IE9 的开发者工具中查看 HTML 的同一部分时,我看到了:
试图发布 IE DevTools 的屏幕截图,但作为一个新用户,该网站不会让我这样做,所以这是我所看到的近似值:
[-] <ul class="tab_seet-tabs>
[-] <span id="forTab">
[-] <li ...>
[+] <a ...>
[-] <span id="forTab_0">
[-] <li ...>
[+] <a ...>
[-] <span id="forTab_1">
[-] <li ...>
[+] <a ...>
[-] <span id="forTab_2">
[-] <li ...>
[+] <a ...>
[-] <span id="forTab_3">
[-] <a ...>
[+] <strong id="tabOption_tabSet5">
因此 IE 似乎错误地解析了 HTML 并将兄弟跨度节点视为彼此的后代(或者更具体地说,它将每个跨度视为前一个跨度的 li 子级的子级)。
这不仅仅是开发者工具的一个怪癖。使用我们的测试工具,我尝试使用以下 xpath 单击标有“历史”的第 5 个选项卡:
//form[@id="form"]/ul/span/li/a[contains(strong,"History")]
这在 Firefox 和 chrome 中运行良好,但无法在 IE9 中找到该节点。但是,如果我在 IE9 中尝试这个 xpath,它可以工作:
//form[@id="form"]/ul/span/li/span/li/span/li/span/li/span/li/a[contains(strong,"History")]
知道什么会导致 IE9 在解析基本的 HTML 父/兄弟/子节点关系时如此悲惨地失败吗?