5

iframe なしで開始するページがあり、アンカーをクリックした後に JavaScript を介して iframe が追加されます。

私が抱えている問題は、フレームに切り替えると、driver.switch_to_frame(x)自分のコンテンツがまだ見つかることです。

見つかったフレームをループして、driver.find_elements_by_tag_name('iframe')見つけると予想されるクラスをそれぞれチェックしようとしましたが、そのような運はありませんでした。

driver.switch_to_active_element()正しいiframeも提供しません。

Seleniumがドライバーから見ているものにJS DOMの変更が反映されていないため、iframeコンテンツにアクセスできないだけかどうかはわかりません。他の iframe についても同じプロセスを問題なく実行しましたが、これはうまくいきません。以下は、私が扱っているものの簡略化されたバージョンです。

JS の前:

<html>
    <body>
      <a onclick="jsmagic">load iframe</a>
    </body>
</html>

JSの後:

<html>
    <body>
      <iframe><div class='modal'>Message</div></iframe>
      <a onclick="jsmagic">load iframe</a>
    </body>
</html>

Python WebDriver の試行:

driver.switch_to_frame(0)
driver.find_elements_by_class_name('modal')
driver.switch_to_default_content()

私はまた、そのようなバリエーションを試しました:

frame = driver.find_elements_by_tag_name('iframe')[0]
driver.switch_to_frame(frame)
driver.find_elements_by_class_name('modal')

オブジェクトに到達するためにイベントを使用driver.execute_scriptしてみましたが、コンテンツに到達することは私を超えています。機能する Firefox コンソール コマンドは、Selenium 経由では実行されません。

4

1 に答える 1

3

それはタイミングの問題のようです。私はこれらの行に沿って何かになりました:

def modal_must_show(self, string):
  for _ in range(12):
    for frame in self.driver.find_elements_by_tag_name('iframe'):
      try:
        if not frame.is_displayed():
          continue
        if frame.parent.page_source.find(string):
          return
      except:
        pass
  assert False, 'Modal missing string'
于 2013-08-27T20:26:41.320 に答える