如何在each.do列表迭代中选择每个li的子元素?

时间:2017-09-05 21:43:16

标签: ruby selenium foreach selenium-chromedriver watir

我需要浏览一个用户列表并在新标签页中打开每个用户。选项卡应在执行操作时关闭,并返回第一个选项卡以选择列表中的下一个用户。我无法按顺序选择列表中的下一个用户。问题是每个用户只能通过点击他们的照片来选择 - 这是列表项的子元素。

HTML

<div class="_gs38e">
 <ul class="_8q670 _b9n99">

  <li class="_6e4x5">
   <div class="_npuc5">
    <a class="_pg23k _9irns _gvoze" style="width: 100px; height: 100px;">
     <img class="_rewi8" src="https://pic.com/t51.2885-
     _1930374081979351040.jpg"></a>
    <div class="_eryrc">
     <a class="_2g7d5 notranslate _o5iw8" title="username1_" 
     href="/username1_/">username1_</a>
    </div>
   </div>
  </li>

  <li class="_6e4x5">
   <div class="_npuc5">
    <a class="_pg23k _9irns _gvoze" style="width: 100px; height: 100px;">
     <img class="_rewi8" src="https://pic.com/t51.2885-
     _1930374081979351040.jpg"></a>
    <div class="_eryrc">
     <a class="_2g7d5 notranslate _o5iw8" title="username1_" 
     href="/username1_/">username1_</a>
    </div>
   </div>
  </li>

  <li class="_6e4x5">
   <div class="_npuc5">
    <a class="_pg23k _9irns _gvoze" style="width: 100px; height: 100px;">
     <img class="_rewi8" src="https://pic.com/t51.2885-
     _1930374081979351040.jpg"></a>
    <div class="_eryrc">
     <a class="_2g7d5 notranslate _o5iw8" title="username1_" 
     href="/username1_/">username1_</a>
    </div>
   </div>
  </li>

  <li class="_6e4x5">
   <div class="_npuc5">
    <a class="_pg23k _9irns _gvoze" style="width: 100px; height: 100px;">
     <img class="_rewi8" src="https://pic.com/t51.2885-
     _1930374081979351040.jpg"></a>
    <div class="_eryrc">
     <a class="_2g7d5 notranslate _o5iw8" title="username1_" 
     href="/username1_/">username1_</a>
    </div>
   </div>
  </li>

  <li class="_6e4x5">
   <div class="_npuc5">
    <a class="_pg23k _9irns _gvoze" style="width: 100px; height: 100px;">
     <img class="_rewi8" src="https://pic.com/t51.2885-
     _1930374081979351040.jpg"></a>
    <div class="_eryrc">
     <a class="_2g7d5 notranslate _o5iw8" title="username1_" 
     href="/username1_/">username1_</a>
    </div>
   </div>
  </li>
 </ul>
</div>

这导致每次选择第一个用户,因为它只是在页面上找到所有列表项的第一张图片。我添加了用户名文本的输出,以确保每个do循环按顺序运行列表项。它每次只打开第一个用户时成功打印不同列表项的用户名。我需要一种方法来将photo元素定义为每个列表项的子项,以包含在each.do循环中

Mylist = browser.ul(:class => "_8q670 _b9n99")

#Index the UL to open each user in order
Mylist.users.each_with_index do |user|

    #open user in new tab by selecting photo

    browser.a(:class => '_pg23k _9irns _gvoze').exists?
    browser.a(:class => '_pg23k _9irns _gvoze').click(:control)
    browser.windows.last.use

    #performs action and closes tab

      browser.windows.last.close


puts user
puts user.text

end

如何定义要选择的元素作为列表中当前li的子元素?

1 个答案:

答案 0 :(得分:1)

在循环中你需要使用

result <- 
    DT[,ID := 1:nrow(DT)] %>% 
    melt(id.vars = "ID") %>% 
    .[, decile := ifelse(grepl("_decile$", variable), "decile", "value")] %>% 
    .[, variable := gsub("_decile$", "", variable)] %>% 
    dcast(ID + variable ~ decile) %>% 
    .[, .(min = min(value), max = max(value), mean = mean(value), sd = sd(value)), 
     keyby = .(variable, decile)] 

原因是浏览器对象可用于搜索主html页面内的元素。如果您在循环中使用“浏览器”,它将查看整个HTML,并且在存在满足搜索条件的多个元素的情况下,它将返回找到的第一个元素。因此,即使它在循环内部,它也会在页面上每次都找到相同的元素。

要使用正在迭代的列表中的当前项,您需要使用您告诉它在列表元素行走时分配给它的名称(在本例中为user.a(:class => '_pg23k _9irns _gvoze').click(:control) )。