我正在编写一个UI测试,该测试转到文章列表并选择load_more按钮,直到该按钮不再可用(因为所有文章都已加载)。问题是此时按钮已被隐藏而不是删除,并且返回此错误
Selenium::WebDriver::Error::UnknownError: unknown error: Element <div
class="">...</div> is not clickable at point (x, y). Other element
would receive the click: <div class="" id="" data-module-name="">...
</div>
(Session info: chrome=65.0.3325.181)
(Driver info: chromedriver=2.36.540469
ruby-2.5.1/gems/selenium-webdriver
3.11.0/lib/selenium/webdriver/remote/response.rb:69:in `assert_ok'
我已经尝试了几种循环类型,但为此,如果我们假设我正在使用
while world.page.has_load_more?
world.page.load_more.click
break if world.page.has_load_more? == false
end
问题是我如何告诉硒这是可以的并且没有错误,所以我可以在我的测试用例(黄瓜)中继续下一步。我意识到循环类型的选择也可能不正确,因此也可以随时建议更改。
首先,正如Rajagopalan指出的那样,你得到的错误不是你的元素不可见(如CSS隐藏),而是它被另一个元素重叠。您可以调用save_and_open_screenshot
以查看哪个元素与按钮重叠(可能是固定页脚等?确保已将窗口大小设置得足够大,以免元素无意中重叠,并确保运行的是最新版本的 Capybara,因为它会尝试通过滚动到视图中来处理硒中的重叠元素(如果可能)。
其次,您问题中的循环同时拥有while
和break
没有多大意义,因为它们检查的是同一件事。 此外,假设"加载更多"按钮正在通过 AJAX 加载并附加到页面,您可能需要等待新元素加载,然后再检查按钮是否存在(click
不会等待操作完成,因为它不知道可以/将触发哪些操作)。 然后,这将变成一个类似
while page.has_button?('Load More')
# Get the current number of visible articles
article_count = page.all('div.article').count # Use whatever selector would match an article in the list
# click the button
page.click_button('Load More')
# ensure more articles have loaded
expect(page).to have_css('div.article', minimum: article_count + 1)
end
注意:您可能希望将其更改为使用您正在使用的任何页面对象方法(has_load_more?
等),但一般逻辑应该是正确的