0

我正在通过 Watir 中的一些 HTML/Javascript 页面进行解析,并且在区分下拉菜单中子表上的两个链接时遇到了一些麻烦。我的表格中有很多这样的实例(我无法更改),例如“概述”和“事件”。

<td class="nav-td-content-submenu wide-text smaller-text" valign="top">
<a href="javascript: menuManager.check('/Manager/navigate?menuID=system_overview');"
    class="report-group-toggle"
    style="color:black"
    id="report_group_servers"> Servers
</a>
<a  href="javascript: menuManager.check('/Manager/navigate?menuID==system_overview');" 
    title="Overview"
    class="report-group-link">      
     <div>Overview</div>
</a>
<a  href="javascript: menuManager.check('/Manager/SavedReportExec.do?value(reportID)=61&amp;value(menuID)=system.1');"      
    title="Events"
    class="report-group-link">      
    <div>Events</div>
</a>
<a  href="javascript: menuManager.check('/Manager/navigate?menuID=alerts');"        
    title="Alerts"
    class="report-group-link">      
    <div>Alerts</div>
</a>
<a  href="javascript: menuManager.check('/Manager/navigate?menuID=logs');"      
    title="Logs"
    class="report-group-link">      
    <div>Logs</div>
</a>

<a href="javascript: menuManager.check('/Manager/SavedReportExec.do?value(reportID)=62&amp;value(menuID)=agent.1');"
        class="report-group-toggle"
        style="color:black"
        id="report_group_agents"> Agents
</a>
<a  href="javascript: menuManager.check('/Manager/SavedReportExec.do?value(reportID)=62&amp;value(menuID)=agent.1');"       
    title="Overview"
    class="report-group-link">      
    <div>Overview</div>
</a>
<a  href="javascript: menuManager.check('/Manager/SavedReportExec.do?value(reportID)=63&amp;value(menuID)=agent.2');"       
    title="Events"
    class="report-group-link">      
    <div>Events</div>
</a>
<a  href="javascript: menuManager.check('/Manager/navigate?menuID=application_monitoring');"        
    title="Application Monitoring"
    class="report-group-link">      
    <div>Application Monitoring</div>
</a>                    

下拉菜单如下所示:

 Servers
 - Overview      
 - Events    
 - Alerts
 - Logs

 Agents
 - Overview
 - Events
 - Application Monitoring

System 的链接直接导航到该小节中的第一个“概述”。(注意:主菜单图标也是 Servers->Overviews 页面的链接)。

我的问题是我试图区分概述,因为它与服务器-> 概述和代理-> 概述有关。

我可以检查是否存在并导航到 Servers->Overview,如下所示:

if $browser.link(:id => 'report_group_servers').exists?
    if $browser.link(:id => 'report_group_servers').exists?
        if $browser.link(:title => 'Overview').exists?
            $browser.link(:title => 'Overview').click
        end
    end
end

但是,即使我尝试访问 Agents->Overview,我仍在导航到 Servers->Overview,所以我尝试:

if $browser.link(:id => 'report_group_agents').exists?
    if $browser.link(:id => 'report_group_agents').exists?
        if $browser.link(:title => 'Overview', :id => 'report_group_agents').exists?
                $browser.link(:title => 'Overview', :id => 'report_group_agents').click
            end
    end
end

在尝试只查看表的主链接(因为服务器链接到服务器->概述和代理链接到代理->概述)我还尝试选择包含“代理”的链接:

if $browser.link(:xpath, "//a[contains(.,'Agents')]/")
    $browser.link(:xpath, "//a[contains(.,'Agents')]/").click
end

然而,这会产生一个错误,因为“包含”是一个评估,这会检查整个页面是否有任何包含代理的链接——这可能是有问题的。

考虑到子表的所有链接都属于“report-group-link”类,我如何能够根据第一个 ID 或参考名称区分这两个链接?

4

1 回答 1

1

解决方案 1 - 使用 text 和 href 属性

2 个概览链接可以通过它们的文本(与其他链接)和它们的 href 属性(彼此)来区分。我认为最干净的解决方案是使用这两个属性:

# The Servers > Overview link
browser.link(:text => 'Overview', :href => /system_overview/)

# The Agents > Overview link
browser.link(:text => 'Overview', :href => /SavedReportExec/)

解决方案 2 - Xpath

如果您确实需要/想要根据链接与服务器和代理链接的关系来查找链接,您可以使用 xpath 中的前兄弟轴。

# The Servers > Overview link
browser.link(:xpath => '//a[preceding-sibling::a[contains(., "Servers")]][contains(., "Overview")]')

# The Agents > Overview link
browser.link(:xpath => '//a[preceding-sibling::a[contains(., "Agents")]][contains(., "Overview")]')

解决方案 3 - CSS

xpath 很难阅读,因此您可以使用 css-selector (使用通用的同级选择器~)代替。

# The Servers > Overview link
browser.link(:css => '#report_group_servers ~ a[title="Overview"]')

# The Agents > Overview link
browser.link(:css => '#report_group_agents ~ a[title="Overview"]')
于 2013-10-09T11:01:19.977 回答