我正在尝试点击页面底部的按钮,该按钮不会向下滚动。当我搜索它以查看它是否显示时,测试通过。但是当我试图点击它时,我收到错误:
Selenium::WebDriver::Error::TimeOutError: timed out after 15 seconds (no such element: Unable to locateelement: {"method":"xpath","selector":"//*[@id="page-top"]/div[1]/h2"}
其他人告诉我,我玩的越多,我也相信它不能点击视线之外的东西,如果Selenium应该模仿浏览网站的人,这是有道理的。
因此,在我尝试找到向下滚动的方法时,我找到的所有内容都告诉我使用“element_to_find.location_once_scrolled_into_view”。一个同事从来没有能够让这个工作,也没有我。也许我误解了它的实际目的?或者我只是错误地使用它?为了澄清,这是Ruby for Chrome中的Selenium。这是我的代码:
assert @wait.until { @driver.find_element(xpath:'//*@id="cancel_form"]/button').displayed? }
# the above test passes
sleep 1 # for good measure for the time being
# line below is a link at bottom of page to bring cancel button into view
terms_of_service_link = @driver.find_element(xpath: '//*[@id="terms_of_service_link"]')
tos_link = terms_of_service_link.displayed?
assert_equal(true, tos_link) # this test passes as well.
terms_of_service_link.location_once_scrolled_into_view
cancel_account_button = @driver.find_element(id: 'cancel_form')
# this is the button i need to click.
cancel_account_button.click()
并且让我感到有点困惑,不是click()失败,或者是scroll_into_view。每当我尝试使用它时,它总是超时并且下一次测试失败。如果点击成功,它将运行测试以验证它是否找到应始终在下一页上的信息。这就是它失败的地方:
Selenium::WebDriver::Error::TimeOutError: timed out after 15 seconds (no such element: Unable to locateelement: {"method":"xpath","selector":"//*[@id="page-top"]/div[1]/h2"}
80: @driver.find_element(id: 'cancel_form').click()
81: # sleep 1
=> 82: assert @wait.until { @driver.find_element(xpath: '//*[@id="page-top"]/div[1]/h2').text.include? "We will be in touch shortly." }
我没有在无头模式下运行它,所以我可以看它工作。它导航到正确的页面,正确运行所有测试,直到它必须找到屏幕外的东西。然后它超时了。它似乎认为它滚动到视图和点击,但事实并非如此。
我可以验证它是不在视图中的项目导致它失败,因为,如果在我的一个测试中涉及同一页面上的send_keys,我添加一些send_key(:tab,:tab),它成功地标签到页面底部,然后成功点击提交。我不希望使用制表符,因为可能标记的内容的数量可能会在某个时间点发生变化,而id可能始终保持不变。
非常感谢任何有关location_once_scrolled_into_view的帮助。或任何其他选择将是受欢迎的。