【问题标题】:Wait until element is present等到元素出现
【发布时间】:2018-01-12 11:04:40
【问题描述】:

我搜索了 stackoverflow 上的每个线程,但找不到适合我的问题的解决方案。在 7/10 的情况下,我的脚本正在下降,因为它们没有找到一个特定的元素。因此,我正在寻找一个机会来告诉我的脚本“等这么久,直到这个元素出现,然后点击它”。

我的代码如下:

require "json"
require "selenium-webdriver"
require "test/unit"

class LogIn < Test::Unit::TestCase

def setup
@driver = Selenium::WebDriver.for :chrome
@base_url = "url"
@accept_next_alert = true
@driver.manage.timeouts.implicit_wait = 30
@verification_errors = []
end
def teardown
@driver.quit
assert_equal [], @verification_errors
end
def test_sms_newsletter
#login
@driver.get "https://secure.shore.com/merchant/sign_in"
@driver.find_element(:id, "merchant_account_email").clear
@driver.find_element(:id, "merchant_account_email").send_keys "key"
@driver.find_element(:id, "merchant_account_password").clear
@driver.find_element(:id, "merchant_account_password").send_keys 
"password"
@driver.find_element(:name, "button").click
@driver.get "https://secure.shore.com"
verify { assert_equal "Shore - Manage your customers", @driver.title }
sleep 5
@driver.find_element(:css, "#asMain > header > a.as-Button.is-
active.as-Button--inverted").click

我要讨论的元素是最后一个:

@driver.find_element(:css, "#asMain > header > a.as-Button.is-active.as-Button--inverted").click

有人有想法吗?

【问题讨论】:

  • 您看到的错误是什么?请通过网址https://secure.shore.com 上的@driver.find_element(:css, "#asMain &gt; header &gt; a.as-Button.is-active.as-Button--inverted").click 更新您到底想做什么。谢谢
  • 正确缩进对调试有很大帮助
  • 嗨@DebanjanB。我的脚本很难及时找到这个元素,因为前端写得不好。因此我想强制脚本先找到元素然后继续。
  • 您不仅在寻找,而且还在点击。对于接收click() 的元素,您需要正确的cssxpath。通过您的css,我在https://secure.shore.com 上没有找到任何元素。谢谢

标签: ruby selenium-webdriver


【解决方案1】:

这是一个等待元素存在的sn-p。在使用之前,您可以在每个元素前面放置一个这样的块。如果块超时,则测试失败。

require 'rubygems'
require 'selenium-webdriver'

browser = Selenium::WebDriver.for :firefox
browser.get "http://localhost/page3"

wait = Selenium::WebDriver::Wait.new(:timeout => 15)

# Add text to a text box
input = wait.until {
    element = browser.find_element(:css, "#asMain > header > a.as-Button.is-active.as-Button--inverted")
    element if element.displayed?
}
input.send_keys("Information")

【讨论】:

  • 嗨凯文,我试过你的建议,但我没有解决。我收到一条错误消息:Error: test_sms_newsletter(LogIn): NameError: undefined local variable or method wait for #&lt;LogIn:0x0000000138d7d0&gt;
【解决方案2】:

等待应该对你有用。尝试使用 FluentWait。

如果问题仍然存在,请使用 JavascriptExecutor 。它将直接通过JS进行操作。如果定位器没问题,它应该可以工作。我正在举一个例子来点击使用 JavascriptExecutor 的任何元素

elementfield = browser.find_element(:css, "#asMain > header > a.as-Button.is-active.as-Button--inverted")
browser.execute_script('arguments[0].click();', elementfield)

希望对你有帮助:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-23
    • 2015-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-25
    • 2016-06-19
    相关资源
    最近更新 更多