私は、ページ内のすべてのiframe
sの名前をリストしようとしています。そのため、Seleniumを介してそれらにアクセスできます。
問題は、iframe
の名前が毎回変わるため、それらすべてをループ処理する必要があることです。
私は得ています:
キャッチされないDOMException:Origin " http:// localhost:808 "のあるフレームがクロスオリジンフレームにアクセスできないようにブロックしました。
私が使用してそれらをループしようとするとエラー:
for (var f = 0; f < window.frames.length; f++) {
console.log(window.frames[f].name)
}
iframe
の名前を別の方法で取得する方法はありますか?
このエラーメッセージ...
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)は、追加のHTTPヘッダーを使用してを通知するメカニズムですブラウザクライアントAUT(テスト対象のアプリケーション)あるオリジン(ドメイン)で実行している場合、別のオリジンのサーバーから選択したリソースにアクセスするためのアクセス許可を与えます。 Webアプリケーションは、独自のオリジンとは異なるオリジン(domain
、protocol
、および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
いくつかの参考文献:
このディスカッションでは、詳細な分析 SecurityError:Blocked a frame with Origin from from cross-Origin frame
このディスカッションでは、さまざまなアプローチについて説明します Selenium Webdriver Javaでdriver.switchTo()。frame(“ frameName”)を使用せずにフレーム内の要素に切り替えることはできますか?
このディスカッションのA Better Approach to Switch Frames
セクションには、さまざまなアプローチがあります セレン内のフレームに関係なく、html要素を選択するにはどうすればよいですか?
汚れたソリューション:
windowsの場合:
chrome.exe --user-data-dir="" --disable-web-security
mac用:
open -a Google\ Chrome --args --disable-web-security --user-data-dir=""
このようにして、chromeを開き、Webセキュリティを無視します。
Selenium
を使用して、次のようなiframeタグを取得できます。
var iframeElems = driver.findElements(webdriver.By.xpath("//iframe"));
次に、それらの要素をループして、name属性を取得します。
iframe.getAttribute('name')
あなたはこのようなものを試すことができます:(JavaScriptについては不明)
var iframeElems = driver.findElements(webdriver.By.tagName("iframe"));
このリストを反復して属性を取得します。
for (var f = 0; f < iframeElems.length; f++) {
console.log(iframeElems.getAttribute("attribute name"))
}