使用page-object单击嵌套表中的链接

时间:2014-07-11 22:50:27

标签: watir-webdriver page-object-gem

我有一个嵌套了表层的链接,并且大部分表都没有任何id。我所拥有的链接位于包含id的表下。无论如何我都无法点击链接。这是html。请帮忙。谢谢!

<html
 <frame src="my_frame"
   <html
    <table style="height:28px;"
     <table style="height:28px;"
      .
      .
       <table style="height:28px;"
         <table id="tblButtons"
           <td id="" title="" onmouseover="this.className = 'hdrBtn hdrBtnover';" onmouseout="this.className = 'hdrBtn';" onmousedown="this.className = 'hdrBtn hdrBtndown';" onmouseup="this.className = 'hdrBtn hdrBtnover';" background="../images/header/barbkg.gif" onclick="if(pageIsReady())parent.ordersummaryform.SubmitIt('OK');" class="hdrBtn"><a href="#" id="" class="linkForTabbingOnly" style="color:009900">Desktop</a></td>
             <a href="#" id="" class="linkForTabbingOnly" style="color:009900">Desktop</a>

我尝试过使用xpath,如下所示:

link(  :desktop_header, :xpath => "a[@href='#' and @class='linkForTabbingOnly' and starts-with(text(),'Desktop')]")

link(  :desktop_header, :xpath => "//table[@id='tblButtons']//a[@href='#' and @class='linkForTabbingOnly' and starts-with(text(),'Desktop')]")

我也试过

我试过

table(:table_button) {frame_element(:src => 'quotesummary_buttons.cfm?QuoteFormat=').table_element(:id => 'tblButtons',:href => '#', :class => 'linkForTabbingOnly' ) }

def click_desktop() table_button_element.cell_element(:class => 'hdrBtn') .child .link_element(:text => 'Desktop') .click end

并使用click_desktop单击链接但出现错误 NoMethodError:未定义的方法`frame_element&#39;对于#

2 个答案:

答案 0 :(得分:2)

基于您的部分HTML和尝试,我猜测问题的关键是框架:

  1. 前几次尝试没有考虑到框架。与其他元素不同,您必须明确告诉Watir何时查看框架。
  2. 在后面的一个例子中,考虑了框架。但是,正如例外所述,使用frame_element不存在定义框架。
  3. Page-Object gem wiki page对如何使用框架有很好的解释。

    提供的HTML似乎有点零散,因此您可能需要对以下建议进行一些调整。但是,希望通过维基页面信息和一些更具体的示例,您可以解决您的问题。

    第一步是确保链接访问者被告知要查看框架:

    class MyPage
      include PageObject
    
      in_frame(:src => 'my_frame') do |frame|
        link(:desktop_header, :href => '#', :class => 'linkForTabbingOnly', :text => /^Desktop/, :frame => frame)  
      end
    end
    

    除非框架中有多个带有文本&#34;桌面&#34;的链接,我可能会建议将链接定位器简化为文本 - 即href和类属性似乎不会添加任何内容。

    class MyPage
      include PageObject
    
      in_frame(:src => 'my_frame') do |frame|
        link(:desktop_header, :text => 'Desktop', :frame => frame)
      end
    end
    

    如果有多个&#34;桌面&#34;页面上的链接,但在&#34; tblButtons&#34;中只有一个这样的链接。表,然后你可以使用嵌套。在下面的示例中,表通过使用:frame定位器位于框架的范围内。然后,通过使用块和嵌套元素方法将链接放在表中。

    class MyPage
      include PageObject
    
      in_frame(:src => 'my_frame') do |frame|
        table(:table_buttons, :id => 'tblButtons', :frame => frame)
        link(:desktop_header) { table_buttons_element.link_element(:text => 'Desktop') }
      end
    end
    

    虽然上述示例的概念应该有效,但很有可能它们会失败并提供部分HTML。您可能需要进行一些更改:

    1. 这些示例假设框架的:src属性为&#34; my_frame&#34;,这是问题的HTML示例中显示的内容。但是,问题中的一个尝试表明:src实际上是&#34; quotesummary_buttons.cfm?QuoteFormat =&#34;。因此,您应确保in_frame(:src => 'my_frame')中的正确:src(或其他定位器)正确无误。
    2. frame元素中有html元素似乎不常见。如果我没记错的话,只允许在frameset元素中使用帧。您实际上可能正在处理iframe而不是frame。如果是这样,您需要将in_frame方法更改为in_iframe。请注意,无论哪种方式,对于框架中的元素,定位器仍然只是:frame

答案 1 :(得分:0)

一般来说,您应该尽量避免使用xpath。它非常脆弱,你的代码很快就会崩溃!

尝试嵌套元素,例如:

@browser.table(:id, /Buttons/).link(:class, /link/)

我认为通过阅读defining different elements.的阅读,你真的会受益。这非常有帮助!