【问题标题】:How to get a list of the <li> elements in an <ul> with Selenium in Ruby?如何在 Ruby 中使用 Selenium 获取 <ul> 中的 <li> 元素列表?
【发布时间】:2016-01-05 09:09:31
【问题描述】:

我正在使用 Selenium WebDriver 我需要在第一个帐户项目上执行和操作(单击),做一些事情,然后回来并在下一个项目上再次重复该过程。它可能多达 90 个帐户项目,因此我试图避免对所有 90 个进行硬编码。知道如何循环访问帐户列表吗?

<ul class="account-list">
  <li class="account-item">one item</li>
  <li class="account-item">two items</li>
  <li class="account-item">three items</li>
</ul>

【问题讨论】:

    标签: html ruby selenium selenium-webdriver


    【解决方案1】:

    您不能在 Selenium 中遍历元素列表,因为当 DOM 更改时,它们的对象引用将变为无效(StaleElement 例外),但您可以通过索引号来执行此操作,只要列表的大小没有改变

    elements = @driver.find_elements(css: ".account-item>a")    
    elements.size.times do |i|
      @driver.find_element(css: ".account-list > li:nth-child(#{i})>a").click
      # Do something
      @driver.navigate.back
    end
    

    【讨论】:

    • 谢谢,如果 Selenium 找不到该元素,我确实会收到错误消息。我尝试了几种不同的方法,但仍然无法得到它。失败/错误:@driver.find_element(:link, ".account-list > li:nth-child(#{i}) > a").click Selenium::WebDriver::Error::NoSuchElementError:
    • 您可以尝试在点击前等待,以防出现竞争条件。
    【解决方案2】:

    您可以通过他们的css 获取所有元素然后迭代这些元素,如下所示:

    elems = driver.find_elements(:css => ".account-list > li")
    url = driver.current_url
    
    for i in 0..elems.size
     # wait until the element loads
     wait.until { driver.find_element(:css => ".account-list > li:nth-child(#{i})")}
    
     elems[i].click()
     #do your tests
     # ...
    
     # go back
     driver.navigate.to url     
    end
    

    【讨论】:

    • 如果元素不在 dom 中,这意味着如果脚本在加载之前到达元素,则存在陈旧元素的问题,尤其是在 chrome 驱动程序中。添加一些等待代码的更好主意。谢谢@alecxe
    • 我认为 alecxe 是对的,因为我得到了这个错误:Failure/Error: elements[i].click() Selenium::WebDriver::Error::StaleElementReferenceError: Element not found in the cache - 也许该页面在查找后发生了变化
    • 我做了,但我没有提到每个 li 里面都有一个标签。所以我将代码修改为:elements = @driver.find_elements(css: ".account-item&gt;a")
    • for i in 0..elements.size elements[i].click() # wait until the element loads wait.until { @driver.find_element(css: ".account-list &gt; li:nth-child(#{i})&gt;a")}
    • @IsraelBautista 它应该在点击之前等待
    猜你喜欢
    • 2015-04-09
    • 2015-12-06
    • 2022-12-05
    • 1970-01-01
    • 2011-08-26
    • 2012-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多