【问题标题】:How to find page object to access iframe inside div in watir如何在watir中查找页面对象以访问div中的iframe
【发布时间】:2016-09-19 13:32:50
【问题描述】:
I want to find a page-object for an Iframe that is inside div element.

<html>
Iframe inside the div element
<div name=first>
    <iframe> 
    </iframe>
</div>
<div name=second>
    <iframe>
    </iframe>
</div>

我尝试找到 div_element 并开始访问 iframe,但我得到了未定义的方法。

谁能帮助我们识别和访问 div 内 iframe 的页面对象?

【问题讨论】:

    标签: ruby ui-automation watir-webdriver


    【解决方案1】:

    页面对象 gem 没有用于框架/iframe 的嵌套元素方法。您将需要找到一个可以相对于浏览器(或另一个框架/iframe)唯一标识框架/iframe 的定位器。唯一支持与其他元素相对位置的定位器是 :css:xpath

    请注意,页面对象 gem 不包含对框架/iframe 对象的引用(即没有像 Watir 中那样的嵌套元素调用)。相反,框架作为元素定位器的一部分传递。

    作为示例,让我们考虑以下 HTML,它添加了(为简洁起见内联)一些框架内容:

    <html>
      <body>
        <div name="first">
          <iframe src="frame1.htm">
            <html>
              <body>
                <span>frame1 - span</span>
                <input type="text" name="field" value="1" />
              </body>
            </html>
          </iframe>
        </div>
        <div name="second">
          <iframe src="frame2.htm">
            <html>
              <body>
                <span>frame2 - span</span>
                <input type="text" name="field" value="2" />
              </body>
            </html>
          </iframe>
        </div>
      </body>
    </html>
    

    根据您与之交互的内容,您可以使用访问器访问 iframe 内容,也可以定义方法。以下页面对象使用访问器方法。请记住将框架定位器传递给每个元素。

    class MyPage
      include PageObject
    
      # Define elements <div name="first"> iframe
      in_iframe(css: 'div[name="first"] iframe') do |f|
        span(:first_iframe_span, frame: f)
        text_field(:first_iframe_field, frame: f)
      end
    
      # Define elements <div name="second"> iframe
      in_iframe(css: 'div[name="second"] iframe') do |f|
        span(:second_iframe_span, frame: f)
        text_field(:second_iframe_field, frame: f)
      end
    end
    

    您可以看到每个定义的元素都返回来自特定 iframe 的值:

    # Elements in the <div name="first"> iframe
    p page.first_iframe_span
    #=> "frame1 - span"
    p page.first_iframe_field
    #=> "1"
    
    # Elements in the <div name="second"> iframe
    p page.second_iframe_span
    #=> "frame2 - span"
    p page.second_iframe_field
    #=> "2"
    

    您可以使用类似的方法动态访问方法中的元素:

    class MyPage
      include PageObject
    
      def do_stuff_in_first_iframe
        in_iframe(css: 'div[name="first"] iframe') do |f|
          p span_element(frame: f).text
          p text_field_element(frame: f).value
        end
      end
    
      def do_stuff_in_second_iframe
        in_iframe(css: 'div[name="second"] iframe') do |f|
          p span_element(frame: f).text
          p text_field_element(frame: f).value
        end
      end
    end
    

    同样,您可以看到您获得了每个 iframe 的值:

    page.do_stuff_in_first_iframe
    #=> "frame1 - span"
    #=> "1"
    
    page.do_stuff_in_second_iframe
    #=> "frame2 - span"
    #=> "2"
    

    【讨论】:

    • 其实我需要访问iframe里面的元素(input,div),例如, div元素里面的iframe
      而不是 iframe 之外的 div 元素。
    • 这正是这段代码所做的。它正在访问 iframe 中的 div 元素。
    • 其实我需要访问div里面的iframe
    • 是的,这段代码也是这样做的。代码说要找到具有特定名称的div 元素——即“第一”或“第二”。然后在 div 中找到 iframe。最后,在 iframe 中访问一个元素。我更新了我的例子,希望更清楚。如果这不是您要查找的内容,我建议您举一个更具体的示例 - 即您想要与之交互的确切 HTML 以及您想要的元素。
    • 嗨@Justin Ko,我可以知道in_iframe 中的iframe 有什么用吗? in_iframe(css: 'div[name="second"] iframe') 做 |f|
    猜你喜欢
    • 2011-08-04
    • 2011-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-27
    • 2018-08-17
    • 2015-11-22
    相关资源
    最近更新 更多