質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

Q&A

0回答

1055閲覧

Seleniumで<IFRAME>の最新ソースが取得できない

mika33532

総合スコア27

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

0グッド

0クリップ

投稿2019/02/05 11:57

編集2019/02/05 20:09

いつもお世話になっております。
C#版SeleniumでWebフォーム(<FORM>)を操作したいのですが、WebDriverのPageSourceで取得したHTMLにはWebフォームのソースコードが含まれていませんでした。
Chromeでソースを確認するとWebフォームのソースコードが含まれていました。
対象のWebページは、初期表示時にJavaScriptで<IFRAME>へフォームのHTMLソースを埋め込んでいるようです。
Chrome上にフォームが表示されて、しばらく経ってからWebDriverのPageSourceを確認したのですが、Webフォームのソースコードが取得できませんでした。(取得できたのは埋め込み前のソースコードだと思われます)
driver.SwitchTo().Frame(iframeElement) を再実行してもダメでした。
埋め込み後のHTMLを取得したいのですが、なにかヒントになりそうなことがありましたら教えていただけますでしょうか。
よろしくお願いいたします。

開発環境:
・Visual Studio 2017 Community (C#)
・Selenium.Chrome.WebDriver v2.45.0 (NuGetでインストール)
・Selenium.Support v3.141.0 (NuGetでインストール)
・Selenium.WebDriver v3.141.0 (NuGetでインストール)


wwbQzhMkhhgEmhU 様、ありがとうございます。

対象のWebサイトは、他社のものでログイン認証後のページになりますので、URLの公開は差し控えたいと思います。
ソースコードは、抜粋ですが下記のような感じです。
問題点がありましたら、ご指摘いただけるとありがたいです。

C#

1// ChromeWebDriverを作成 2IWebDriver driver; 3chromeDriverFilePath = "C:\chromedriver"; 4hideCommandPromptWindow = true; 5chromeOptions = new ChromeOptions(); 6ChromeDriverService chromeService = ChromeDriverService.CreateDefaultService(chromeDriverFilePath); 7chromeService.HideCommandPromptWindow = hideCommandPromptWindow; 8ChromeOptions chromeOptions = new ChromeOptions(); 9ChromeDriver driver = new ChromeDriver(chromeService, chromeOptions); 10 11// トップページを開く(この時点でiframeIdが指す<IFRAME>に概要説明のHTMLが表示される) 12driver.Url = "https://xxxxx.co.jp/index.aspx"; 13 14// 取引ボタンをクリックする(SeleniumのClick()やSendKeys(Keys.Enter)が効かなかったので現在は手動でクリックしている) 15// このときにJSによりiframeIdが指す<IFRAME>の内容が取引用の<FORM>に差し替えられる。 16 17// JSの処理が完全に完了するまで長時間Waitする 18Thread.Sleep(10 * 1000); 19 20// IFRAMEを探してSwitchする 21var iframeElements = driver.FindElements(By.Id(iframeId)); 22var iframeElement = iframeElements[0]; 23driver.SwitchTo().Frame(iframeElement); 24 25// IFRAME内にある<FORM>を取得する 26Console.WriteLine(driver.PageSource); // ★1.取引用の<FORM>が含まれるHTMLではなく、概要説明のHTMLが表示された。 27var orderForm = driver.FindElements(By.Name("orderForm")); // ★2.取引用の<FORM>では無いのでnullが返ってくる。 28 29// 元に戻す 30driver.SwitchTo().DefaultContent();

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wwbQzhMkhhgEmhU

2019/02/05 18:06

selenium使ったことないですが、多分この手の問題は実際にそのURLを開示するか、同じようなものを自分で作って開示しないと、内容を把握できないと思います。なんとなくページ遷移を発生させないsubmit処理のためのiframe使用(↓のURL参照)に見えるんですが、そうなると、そういうコードを見せてもらわないと、対応が取れないのではないかと思います。 (*) https://developer.mozilla.org/ja/docs/Learn/HTML/Forms/Sending_forms_through_JavaScript#Sending_form_data
wwbQzhMkhhgEmhU

2019/02/05 21:45

何か全然話が伝わってないようですが、気にしているのは、HTMLとJavaScriptの話です。 Seleniumのコードなんて用件がハッキリすれば書くだけだと思うので。 クリアしなければならない原因や課題が明示できない状態で、問題があることだけ分かっているコードを見せられても解決は難しいと思います。URLを開示するか、同じ現象を起こせるHTML+JavaScriptを提示できないのなら、個人的には自力解決をオススメします。 すみませんが、タイミング悪く私用で数日間PCを触れない環境に行かないといけなくなってしまったので、自力解決か他の方の回答を待ってください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問