在Watir的下拉菜单中导航子表

时间:2013-10-08 22:08:08

标签: javascript html ruby watir

我正在解析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

系统的链接直接导航到子部分中的第一个“概述”。 (注意:主菜单图标也是Servers-&gt; Overviews页面的链接)。

我的问题是,我正在尝试区分概述,因为它与服务器有关 - &gt;概述和代理 - &gt;概述。

我可以检查是否存在并导航到Servers-&gt;概述,如下所示:

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

然而,即使我尝试访问代理商 - >概述我仍然导航到服务器 - &gt;概述所以我尝试:

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

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

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

1 个答案:

答案 0 :(得分: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"]')