4

私のWebページでは、ページは読み込まれますが、ページのサブタブは20秒間クリックできません(これより長い場合もあります)。ページの内容は-

<nav id="subTabHeaders">
 <div class="selected" data-name="ab">AB</div>
 <div class="" data-name="cd">CD</div>
 <div class="" data-name="ef">EF</div>
 <div class="" data-name="gh">GH</div>
</nav>

サブタブをクリックする必要があるため、次の方法でこれを試しました-スリープしてからelement.clickを入力します。ただし、サブタブ要素が時間の前後にクリック可能になることがあるため、スリープは理想的な対処方法ではありません。眠りにつく。

睡眠を使って、私は次のことをしました-

element = WAIT.until { driver.find_element(:xpath, ".//*[@id='subTabHeaders']/div[3]")}
sleep 20
element.click

スリープ時間が経過した後に要素がクリック可能であり、スリープ時間が経過した直後に要素をクリックした場合(つまり、(上記のコードを使用して)要素が30秒後にクリック可能になると仮定しますが、20秒後に要素をクリックします)、実際のクリックアクション発生せず、クリックしてもエラーは返されません。

要素がクリック可能かどうかを確認するRubyメソッドはありますか?クリックするタイミングを知るためです。

4

4 に答える 4

3

ルビーバインディングページから:(ドライバーの例を参照)

# wait for a specific element to show up
wait = Selenium::WebDriver::Wait.new(:timeout => 10) # seconds
wait.until { driver.find_element(:id => "foo") }

したがって、通常は次のようなことができます。

wait = Selenium::WebDriver::Wait.new(:timeout => 40)
wait.until do
  element = driver.find_element(:xpath, ".//*[@id='subTabHeaders']/div[3]")
  element.click
end

またはもっと簡潔に

wait = Selenium::WebDriver::Wait.new(:timeout => 40)
wait.until { driver.find_element(:xpath, ".//*[@id='subTabHeaders']/div[3]").click }

ただし、クリックしてもエラーは発生しないと言っているので、クリックは実際に機能しているように見えます。ページだけでそのタブを表示する準備ができていません。ここで非同期JavaScriptが実行されていると思います。
したがって、試行できるのは待機ブロック内です。クリックによって目的の変更が発生したことを確認してください。私は推測していますが、次のようなことを試すことができます:

wait = Selenium::WebDriver::Wait.new(:timeout => 40)
wait.until do
  driver.find_element(:xpath, ".//*[@id='subTabHeaders']/div[3]").click
  driver.find_element(:xpath, ".//*[@id='subTabHeaders']/div[3][@class='selected']")
end

ここで重要なことは、ブロックが真の結果を得るか、タイムアウトを超えるまで、#untilが待機して繰り返すことです。

于 2013-03-26T19:28:23.820 に答える
1

どうですか

WebDriverWait wait = new WebDriverWait(driver,30);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id(subTabHeaders)));
于 2013-03-26T17:59:29.067 に答える
0

それがあなたを助けることを願っています:

begin

    element = WAIT.until { driver.find_element(:xpath, ".//*[@id='subTabHeaders']/div[3]")}
    sleep 20
    element.click

rescue Selenium::WebDriver::Error::StaleElementReferenceError

    p "Indicates that a reference to an element is now “stale” - the element no longer appears in the DOM of the page."

end

また

あなたはこれを試すことができます:

begin

    wait = Selenium::WebDriver::Wait.new(:timeout => 10) # seconds
    wait.until { driver.title.include? "page title" }
    driver.find_element(:xpath, ".//*[@id='subTabHeaders']/div[3]")}.click

rescue Selenium::WebDriver::Error::StaleElementReferenceError

    p "element is not present"

end
于 2013-03-26T17:32:56.883 に答える
0

これが私が使用するものです-リンクがクリック可能かどうかをテストするために、そうでなければ別のURLに移動します:

    if (logOutLink.Exists() && ExpectedConditions.ElementToBeClickable(logOutLink).Equals(true))
    {
        logOutLink.Click();
    }
    else
    {
        Browser.Goto("/");
    }
于 2016-03-09T05:15:23.210 に答える