3

私はRubyとSelenium-Webdriverを初めて使用するので、助けてください:)

受信トレイに送信された、画像が含まれ、Firefoxでスクリーンショットを撮るメールキャンペーンを開こうとしています。しかし、画像が完全に読み込まれるまで待たせることはできません。[画像を表示]をクリックすると、スクリーンショットはすでに撮影されていますが、その時点では画像が読み込まれていません。すべての画像が表示された後、スクリプトを一時停止して、しばらくしてからスクリーンショットを撮るにはどうすればよいですか?

助けてください :(

ベローは私のスクリプトです:

enter code here

require 'selenium-webdriver'

browser = Selenium::WebDriver.for :firefox

#==========================================================================================

wait = browser.manage.timeouts.implicit_wait = 15
#==========================================================================================
url = 'https://login.yahoo.com/config/login_verify2?.intl=us&.src=ym'
# Open browser (firefox)
browser.navigate.to url
browser.find_element(:id, 'username').send_keys "some yahoo id"
browser.find_element(:id, 'passwd').send_key "some password"
browser.find_element(:id, ".save").click
browser.find_element(:id, "inbox-label").click
browser.find_element(:xpath, "//div[@class='subj']").click
browser.find_element(:xpath, "//a[@title='Display blocked images']").click

result_page_title = browser.find_element(:tag_name, 'title')
    puts "Title of the page: \t\t: #{result_page_title.text}"
    browser.save_screenshot "1.jpg"
4

4 に答える 4

4

を使用Implicit Wait and Explicit Waitして、特定の Web 要素がページに表示されるまで待機できます。定義できる待機期間は、アプリケーションによって異なります。

明示的な待機:

明示的な待機は、コード内で先に進む前に、特定の条件が発生するのを待機するように定義するコードです。条件が達成されると、待機が終了し、次のステップに進みます。

コード:

 WebDriverWait wait = new WebDriverWait(driver,30);
 wait.until(ExpectedConditions.visibilityOfElementLocated(By.id(strEdit)));

または

 WebElement myDynamicElement = (new WebDriverWait(driver, 30))
 .until(new ExpectedCondition<WebElement>(){
@Override
public WebElement apply(WebDriver d) {
    return d.findElement(By.id("myDynamicElement"));
}});

これは、TimeoutException をスローする前に最大 30 秒待機するか、要素が見つかった場合は 0 から 30 秒でそれを返します。デフォルトでは、WebDriverWait は正常に返されるまで 500 ミリ秒ごとに ExpectedCondition を呼び出します。成功した戻り値は、ExpectedCondition の型で、他のすべての ExpectedCondition 型のブール型の戻り値は true または null ではありません。

アプリケーションの必要に応じて、ExpectedConditions クラスを使用できます。

暗黙の待機:

暗黙の待機とは、要素がすぐに利用できない場合に要素を見つけようとするときに、WebDriver に一定時間 DOM をポーリングするように指示することです。

コード:

 driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

覚えておくべきことの 1 つは、暗黙的な待機が設定されると、WebDriver オブジェクト インスタンスの存続期間中はそのままになることです。

詳細については、このリンクを使用してくださいhttp://seleniumhq.org/docs/04_webdriver_advanced.jsp

上記のコードは にありJavaます。言語の必要に応じて変更してください。

于 2013-02-05T06:34:09.567 に答える
4

ドキュメントのRuby コード(「ruby」ボタンをクリック):

wait = Selenium::WebDriver::Wait.new(:timeout => 10) # seconds
begin
  element = wait.until { driver.find_element(:id => "some-dynamic-element") }
ensure
  driver.quit
end

私のために働く

于 2014-07-12T21:58:11.790 に答える
2

上記の答えに追加するために、Rubyで暗黙的および明示的な待機を使用する方法を次に示します。

暗黙の待機

次のような数行で初期化した後、このオプションをSelenium::WebDriverに渡します。

browser = Selenium::WebDriver.for :firefox
browser.manage.timeouts.implicit_wait = 10

「10」を、ページの更新やその他のイベントをブラウザが待機する秒数に置き換えるだけです。

明示的な待機

Seleniumで明示的な待機を宣言するには2つのステップがあります。最初に待機オブジェクトを宣言してタイムアウト期間を設定し、次にSelenium::Webdriverの.untilメソッドを使用して待機を呼び出します。あなたの例では、次のようになります。

wait = Selenium::WebDriver::Wait.new(:timeout => 10)
wait.until { browser.find_element(:xpath, "//path/to/picture").displayed? }

これにより、Webdriverは、画像要素が表示されるまで最大10秒待機するようになります。.enabledを使用することもできますか?待っている要素がインタラクティブな要素である場合-これは、Ajaxベースの入力フォームで作業しているときに特に役立ちます。

スクリプトの開始時に明示的な待機期間を宣言し、必要なときにいつでもオブジェクトを再度参照することもできます。新しいタイムアウトを設定する場合を除いて、再宣言する必要はありません。個人的には、メソッドにラップされるまでwait.を保持するのが好きです。これは、繰り返し参照することがわかっているためです。何かのようなもの:

def wait_for_element_present( how_long=5, how, what )
  wait_for_it = Selenium::WebDriver::Wait.new(:timeout => how_long )
  wait_for_it.until { @browser.find_element(how, what) }
end

(ブラウザーをインスタンス変数として宣言する方が簡単なので、毎回メソッドに渡す必要はありませんが、その部分はあなた次第だと思いますか?)

于 2013-02-06T21:59:10.533 に答える