web-dev-qa-db-ja.com

フレームにIDがない場合にSelenium Webdriverでフレームを識別して切り替える方法

誰でもタイトルを持っているiframeを特定してiframeに切り替える方法を教えてもらえますか?

<iframe frameborder="0" style="border: 0px none; width: 100%; height: 356px; min-width: 0px; min-height: 0px; overflow: auto;" dojoattachpoint="frame" title="Fill Quote" src="https://tssstrpms501.corp.trelleborg.com:12001/teamworks/process.lsw?zWorkflowState=1&zTaskId=4581&zResetContext=true&coachDebugTrace=none">

私は以下のコードで試しましたが、動作していません

driver.switchTo().frame(driver.findElement(By.tagName("iframe")));
26
Sunil wali

cssSelectorを使用できます。

driver.switchTo().frame(driver.findElement(By.cssSelector("iframe[title='Fill Quote']")));
25
Amith

driver.switchTo().frame()には複数のオーバーロードがあります。

  1. driver.switchTo().frame(name_or_id)
    ここでiframeにはIDも名前もないので、あなたのためではありません。

  2. driver.switchTo().frame(index)
    これは選択する最後のオプションです。インデックスの使用は想像できるほど安定していないためです。これがページ内の唯一のiframeである場合は、driver.switchTo().frame(0)を試してください

  3. driver.switchTo().frame(iframe_element)
    最も一般的なもの。 iframeを他の要素と同じように見つけて、メソッドに渡します。

ここでは、title属性で検索するのが最善のようです。

driver.switchTo().frame(driver.findElement(By.cssSelector("iframe[title='Fill Quote']")));
// driver.switchTo().frame(driver.findElement(By.xpath(".//iframe[@title='Fill Quote']")));
38
Yi Zeng

Srcを使用してフレームに切り替えることもできます。使用できるものは次のとおりです。

driver.switchTo().frame(driver.findElement(By.xpath(".//iframe[@src='https://tssstrpms501.corp.trelleborg.com:12001/teamworks/process.lsw?zWorkflowState=1&zTaskId=4581&zResetContext=true&coachDebugTrace=none']")));
4
Shawn Ghavami

フレームに切り替える前に、必ずデフォルトのコンテンツに切り替えてください。

driver.switchTo().defaultContent();
driver.switchTo().frame(x);

xはフレーム番号にすることも、driver.findlementを実行して、使用可能なオプション(driver.findElementByName("Name")など)を使用することもできます。

3
user6147581

Css SelectorまたはXpathを使用できます。

アプローチ1:CSSセレクター

driver.switchTo().frame(driver.findElement(By.cssSelector("iframe[title='Fill Quote']")));

アプローチ2:Xpath

driver.switchTo().frame(driver.findElement(By.xpath("//iframe[@title='Fill Quote']")));

https://seleniumatfingertips.wordpress.com/2016/07/05/handling-frames-in-Selenium-webdriver-with-Java/

2
Jackin Shah

1)HTMLビューに移動

2)iframeと入力し、必要なフレームを見つけて値をカウントし、それを使用して切り替えます

oASelFW.driver.switchTo().frame(2); 

最初のフレームの場合は、oASelFW.driver.switchTo().frame(0);を使用します

2番目のフレームの場合は、それぞれoASelFW.driver.switchTo().frame(1);を使用します

2
Ajay

フレームに切り替えるには3つの方法があります

1)Can use id
2)Can use name of the frame
3)Can use WebElement of the frame

2-> driver.switchTo().frame("name of the frame");

1
Kiran Kumar

これを行う最も簡単な方法は次のとおりです。フレームの場合は、フィールドを右クリックし、「タブでフレームを開く」という選択肢が表示されたら、それを実行します。

次に、フレームのURLを取得します。これは、「driver.get( http:// blah blah ..)」を使用してPythonスクリプトに挿入したものです

その後、Seleniumは名前付き要素を見つけることができます。これにより、ここで学習していたが機能しなかったすべての提案を試す時間を節約できました。私の問題は、フレーム内にあったことです。

Linuxを使用しており、別のタブでフレームを単独で開く右クリックオプションを使用できます。私はWindowsを使用していないので、右クリックメニューでそのオプションを取得できるかどうかわかりません。

ガンザローラ

1
Ganz

while;でこれに苦労しました。特にイライラするWebサイトでは、サイト全体にいくつかのネストされたフレームがありました。私はフレームを識別する方法を見つけることができませんでした-名前、id、xpath、cssセレクター-何もありません。

最終的に、フレームには番号が付けられ、トップレベルがframe(0)、2番目のframe(1)などであることに気付きました。

必要な要素がどのフレームにあるのかまだわからなかったので、0から50までサイクルして次のフレームに移動し、必要な要素にアクセスしようとするforループを作成しました。失敗した場合、メッセージを出力して続行します。

このような単純な解決策のために、この問題に時間をかけすぎていた-_-

driver.switch_to.default_content()
for x in range(50):
    try:
        driver.switch_to.frame(x)
        driver.find_element_by_xpath("//*[@id='23']").click()
        driver.find_element_by_xpath("/html/body/form/table/tbody/tr[1]/td/ul/li[49]/a").click()
    except:
        print("It's not: ", x)
        continue
0
Bilbo Swaggins