Python+selenium+chromeでXML要素の選択ができない
こんにちは、ログインするサイトから、
Python+selenium+chromeでデータ収集したいと考えております。
実際に試してみたところ、最初のログイン画面は自動でログインできたのですが、
ログイン後開く以下の画面でXML要素の選択がうまくできません。
以下現状を記載しました、解決法ご教示いただけますようお願いいたします。
この画面「ダッシュボード」はやや特殊で、取引種類ごとに以下のようなプルダウンが合計6個配置されており、プルダウンのラベルをそのままクリックで「新取引システム」画面、リストを表示させてクリックで「旧取引システム」画面が開きます。
今回は、FX口座・新取引システムの画面を開こうとしています。
以下の手順で画面を操作しようとしましたが、現状エラーとなりうまくいきません。
1.まず、Chrome画面上でFX口座のプルダウンラベルを右クリックして、検証を選択すると、デベロッパーツールに以下のXMLのうち>>>>>から<<<<<の部分が反転表示されました。
<platform-segmented-button
ng-if="controller.account.canOpenPlatforms"
show-walk-me="::controller.account.isWalkMeEnabled"
account="controller.account">
<div class="segmented-button">
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
<a class="segmented-button-label"
ng-class="{ 'center-text': !controller.shouldShowDropdownArrow,
'segmented-button-label-disabled': controller.account.isDisabled }"
ng-click="controller.openFirstPlatform()" data-e2e="openPlatformButton">新取引システム</a>
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
<!---->
<div class="segmented-button-dropdown-arrow"
ng-if="controller.shouldShowDropdownArrow"
ng-class="{'segmented-button-dropdown-arrow-disabled':
controller.account.isDisabled,'segmented-button-dropdown-arrow-pressed':
controller.isDropdownOpen,'walk-me-cfd-platforms-promo':
controller.showWalkMe}"ng-click="controller.toggleDropdown()">
<span class="icon icon-top-nav-dropdown-arrow-hover"></span> </div><!----> </div>
<!---->
</platform-segmented-button>
2.反転表示された部分を右クリックして、Copy > CopyXPath を選択するとこの部分のXpathが以下のとおりコピーされました。
//*[@id="my-ig"]/div[2]/div/ig-state-change-
spinner/div/div/div/div/div/div/div[1]/div/account-
table/div/div/div[2]/div[3]/div/leveraged-account-table-row/div/div[1]/platform-
segmented-button/div/a
これを利用してログイン処理のあとで当該プルダウンをクリックする以下スクリプトを実行したところ、
from selenium import webdriver
driver = webdriver.Chrome("c:/driver/chromedriver.exe")
driver.get(ログイン画面のurl)
elem_user_id = driver.find_element_by_id("account_id")
elem_user_id.send_keys(ユーザーID)
elem_password = driver.find_element_by_id("nonEncryptedPassword")
elem_password.send_keys(パスワード)
elem_login_btn = driver.find_element_by_id("loginbutton")
elem_login_btn.click()
elem_segmented_btn = driver.find_element_by_xpath("//*[@id='my-ig']/div[2]/div/ig-
state-change-spinner/div/div/div/div/div/div/div[1]/div/account-
table/div/div/div[2]/div[3]/div/leveraged-account-table-row/div/div[1]/platform-
segmented-button/div/a")
elem_segmented_btn.click()
以下のUnable to locate elementのエラーとなりました。
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException:
Message: no such element:
Unable to locate element:
3.その他、
このプルダウン6個のaタグは、すべてclass="segmented-button-label" の属性、またaタグのすぐ上のdivタグがclass="segmented-button"属性を持っており、
FX口座は上から3番目にあたるため、プルダウンをクリックするスクリプトを
elem_segmented_btn = driver.find_element_by_xpath("(//*[@class=
'segmented-button-label'])[3]")
elem_segmented_btn.click()
elem_segmented_btn = driver.find_element_by_xpath("(//*[@class=
'segmented-button'])[3]")
elem_segmented_btn.click()
としてみましたが、同じエラーとなりました。
XML要素の参照をいろいろと検索していて、
『ドロップダウンメニューのHTMLコードを誤解されています。HTMLソースではなく、開発者ツールなどで確認できるDOMツリーを見ましょう。』
『HTMLソースでは 要素ですが、画面の表示時に 要素に置き換えられています。』など見かけました、今回のヒントとなるようにも思いますが、開発者ツール(このばあいChromeのデベロッパーツール?)どう使えば「書き換え」を確認できるのかよくわかりません。
よろしくお願いします。