web-dev-qa-db-ja.com

キャッチされないDOMException:ページにiframeをリストしているときに、Origin "http:// localhost:8080"のフレームがクロスオリジンフレームにアクセスできないようにしました

私は、ページ内のすべてのiframesの名前をリストしようとしています。そのため、Seleniumを介してそれらにアクセスできます。

問題は、iframeの名前が毎回変わるため、それらすべてをループ処理する必要があることです。

私は得ています:

キャッチされないDOMException:Origin " http:// localhost:808 "のあるフレームがクロスオリジンフレームにアクセスできないようにブロックしました。

私が使用してそれらをループしようとするとエラー:

for (var f = 0; f < window.frames.length; f++) {
    console.log(window.frames[f].name)
}

iframeの名前を別の方法で取得する方法はありますか?

2
TwoShorts

このエラーメッセージ...

Uncaught DOMException: Blocked a frame with Origin "http://localhost:8080" from accessing a cross-Origin frame.

...は、WebDriverインスタンスブロックされたがクロスオリジンフレームにアクセスできないことを意味します。


同一起源ポリシー

Same-Originポリシー :Same-Originポリシーは、あるOriginからロードされたドキュメントまたはスクリプトが別のOriginのリソースと対話する方法を制限します。これは、潜在的に悪意のあるドキュメントを分離するための重要なセキュリティメカニズムです。


クロスオリジンリソースシェアリング(CORS)

クロスオリジンリソースシェアリング(CORS) :クロスオリジンリソースシェアリング(CORS)は、追加のHTTPヘッダーを使用してを通知するメカニズムですブラウザクライアントAUT(テスト対象のアプリケーション)あるオリジン(ドメイン)で実行している場合、別のオリジンのサーバーから選択したリソースにアクセスするためのアクセス許可を与えます。 Webアプリケーションは、独自のオリジンとは異なるオリジン(domainprotocol、およびport)を持つリソースをリクエストすると、クロスオリジンHTTPリクエストを作成します。


起源の例

以下は、OriginとURLの比較例ですhttp://store.company.com/dir/page.html

URL                                                  Outcome    Reason
http://store.company.com/dir2/other.html             Success
http://store.company.com/dir/inner/another.html      Success
https://store.company.com/secure.html                Failure    Different protocol
http://store.company.com:81/dir/etc.html             Failure    Different port
http://news.company.com/dir/other.html               Failure    Different Host

何が悪かったのか

framesをループ処理しようとしたときに、スクリプト/プログラムがJavaScriptを使用して別のOriginで<iframe>にアクセスしようとしました。これは、実現した場合、セキュリティ上の欠陥になります。上記のように、同一オリジンポリシーブラウザは、異なるオリジンで<iframe>にアクセスしようとするスクリプトをブロックします。

プロトコルポート(指定されている場合)、およびホストが両方のWebページで同じ場合、2つのページは同じオリジンを持ちます。これは、"scheme/Host/port Tuple"と呼ばれることもあります(「タプル」は、全体を構成する3つのコンポーネントのセットです)。目的のフレームにアクセスする場合、プロトコルドメインホスト名およびポートは、同じドメインと同じである必要があります。

解決

[〜#〜] aut [〜#〜]には多数のフレームが含まれている可能性があります/iframesそれらの一部は特定のJavaScriptの後でのみ読み込まれる可能性があります/Ajaxは完了しましたが、それらの一部はstyle属性がdisplay:none;または可視性として設定されている可能性があります非表示。もちろん、それらすべてと対話する必要はありません。したがって、<iframe>属性を識別し、それに応じて切り替える方がより良いアプローチになります。次の方法で<iframe>に切り替えることができます。

  • Frame Name
  • Frame ID
  • Frame Index
  • WebElement

ベストプラクティスのように、フレームに切り替える意図がある場合は WebDriverWait for frameToBeAvailableAndSwitchToIt に従って以下の参照。

ここでは、関連するディスカッションを見つけることができます ncaught DOMException


参考文献

いくつかの参考文献:

11
DebanjanB

汚れたソリューション:

windowsの場合:

chrome.exe --user-data-dir="" --disable-web-security

mac用:

open -a Google\ Chrome --args --disable-web-security --user-data-dir=""

このようにして、chromeを開き、Webセキュリティを無視します。

2
Angia

Seleniumを使用して、次のようなiframeタグを取得できます。

var iframeElems = driver.findElements(webdriver.By.xpath("//iframe"));

次に、それらの要素をループして、name属性を取得します。

iframe.getAttribute('name')
1
PixelEinstein

あなたはこのようなものを試すことができます:(JavaScriptについては不明)

var iframeElems = driver.findElements(webdriver.By.tagName("iframe"));

このリストを反復して属性を取得します。

for (var f = 0; f < iframeElems.length; f++) {
    console.log(iframeElems.getAttribute("attribute name"))
}
0
cruisepandey