如何在 watir 中调用 div 下的 div class?

How can I call a div class under div in watir?

我正在使用 Ruby 和 Watir 创建自动化测试脚本。

我正在尝试从这些代码行中调用 div class:

<div class="slimScrollDiv" style="position: relative; overflow: hidden; width: auto; height: 500px;">

  <div class="modal-body" style="overflow: hidden; width: auto; height: 500px;">
    <form id="user-form" class="form-inline" enctype="multipart/form-data" method="POST" novalidate="novalidate">
        <fieldset></fieldset>
    </form>
  </div>

我的目标是使用这个 browser.div(:class => '').send_keys :space 因为我想滚动 div,这样我就可以 send_key "" 在其他一些隐藏的文本字段中。 我什至尝试使用 browser.scroll.to :bottom,但它仍然不起作用。

隐藏 text_field 或只是在页面中不可见?

你可以尝试关注:

browser.text_field(:id => 'myid').focus

或者如果您需要向下滚动直到它可见

unless browser.text_field(:id => 'myid').visible?   
  browser.div(:class => 'slimScrollDiv').send_keys :arrow_down
end

或者如果您需要向下滚动到页脚(页面末尾)

 browser.div(:id => 'footer').wd.location_once_scrolled_into_view

所以我正在猜测您在这里真正想要完成的事情。我将首先按照最初所述解决您的问题,然后解决如何做我认为您正在努力完成的事情。

在其他元素中选择元素 高级答案是这样做没有什么特别的,在许多(大多数)情况下,您甚至不需要担心元素嵌套的深度,只要您有独特的方法来识别它,例如一个 class、名称等是唯一的。例如,在您提供的代码中,要获得带有 class 模态正文的 div,您只需执行

browser.div(:class => 'modal-body)

如果页面上有很多 divs class,那么您可能想通过查看其他一些独特的容器元素来找到您想要的那个,这样您找到合适的.. 在上面的代码中类似于

browser.div(:class => 'slimScrollDiv').div(:class => 'modal-body)

通常只有当很难找到一种简单的方法来识别元素时,您才会这样做,因为它的属性很少或没有,或者属性不唯一。

滚动自定义控件 我认为这是你真正的问题。您似乎有一个带有非标准滚动框的控件。也就是说,不是简单的 HTML 而是定义为浏览器创建和控制滚动框(通常可以使用您已经尝试过的方法,甚至可以滚动到视图中 auto_magically) 你有一个自定义控件,其中滚动框由 javascript 代码驱动,例如 jQuery 或 Bootstrap。此类代码通常是事件驱动的,当鼠标悬停在控件上时寻找诸如鼠标滚轮移动之类的东西,或者手动抓取并拖动正在呈现的元素以使其看起来像滚动条。通常此类控件不会响应 space 或箭头之类的按键,即使它们已被选中、单击、具有焦点等

我仍然建议首先尝试在滚动框内您想要的子元素上使用 .location_once_scrolled_into_view。 (参见其他答案中的示例)如果这不起作用,请尝试操纵滚动区域的控件。

根据您的代码片段中的 class 值,我认为您可能正在处理一个 jQuery 强大的 'slimScroll' 控件,类似于 this page. 上显示的控件 如果确实如此,那么就可以通过在scrollbar元素上使用drag的方法来滚动控件了。在 slimScroll 中,您想要的元素将位于带有 class 'slimScrollDiv' 的 div 内,并且是带有 class 'slimScrollBar' 的另一个 div。

只要滚动条可见,您就应该能够对其执行 .drag_and_drop_by 以滚动滚动框中的内容。如果它不可见(如链接页面的第一个示例中可能发生的那样),那么它可能会更难,您可能必须尝试触发鼠标悬停事件,或调用一些 JS 代码以将其样式更改为不隐藏。您将需要尝试查看一次要拖动多少像素才能滚动 window 和 'right' 量,具体取决于其中的内容量。 (可能您可以根据元素的 .style 'height' 值来计算,但这需要对实际页面进行试验,并且只有在框中的内容量可变时才需要)

对于链接页面上的第二个示例,我可以使用以下代码滚动内容

scrollbar = browser.div(:class => 'slimScrollBar', :index => 1)
scrollbar.drag_and_drop_by 0,10

我不确定你的滚动框里面有什么,但出于伪代码的目的,我们只称它为 'thing_I_want' 然后你可以使用类似这样的代码将它滚动到视图中

scrollbar = browser.div(:class => 'slimScrollBar')
until thing_I_want.present?
  scrollbar.drag_and_drop_by 0,5
end

正如我所说,您可能需要调整拖动距离以获得 'right' 数量,但 5(像素)似乎是一个合理的起点。