2017-06-03 6 views
1

言語、場所などによって異なるバージョンのWebサイトにフォームを記入しようとしています。私はすべてのリクエストに対して同じFirefoxプロファイルを使用しています。情報はクッキーにローカルに保存されるため、最初に設定を選択した後はしばらくの間モーダルが表示されません。 しかし:離れて、フォームからフォーカスを取り、より多くの困難を追加するにはElementNotInteractableException.Selenium Python bindings:矛盾したモーダルを処理する

を引き起こし、矛盾現れているようだ、モーダルは、多くの場合、ページが読み込まれた後、いくつかの時間が表示されます。たとえば、最初のフィールドは既に入力されていて、次に表示されます。

私の質問は、このモーダルを処理する最良の方法は何ですか?外見によって例外原因をキャッチし、モーダルの存在を確認してから、フォームフィールドに値を入力し続けることはできますか?または、より良い解決策がありますか?

ありがとうございました。

私がこれまで試してみましたコード:

url = "https://www.aircanada.com/ca/en/aco/home.html" 
control_profile = webdriver.FirefoxProfile('/path/to/my/profile') 
browser_control = webdriver.Firefox(control_profile) 

browser_control.get(url) 

# To deal with the modal, but obviously fails when it is not present 
browser_control.find_element_by_id('enCAEdition').click() 

# two text fields I tried to fill out, as a sanity check 
departure = browser_control.find_element_by_id('origin_focus_0') 
departure.send_keys("my departure location") 
departure.send_keys(Keys.RETURN) 

destination = browser_control.find_element_by_id('destination_label_0') 
destination.send_keys("my destination") 
destination.send_keys(Keys.RETURN) 
+0

、ページ 'URL'とコードを共有することができますが、これまでに試したことはありますか? – Andersson

+0

確かに、ここにページがあります:https://www.aircanada.com/ca/en/aco/home.html、私のコードを質問に追加します –

+0

私はいくつかのテキストを記入しようとする2つの簡単な例を含めましたフィールドは、モーダルのために失敗します。多くの場合、最初のフィールドは正しく記入されていますが、返品を送信する直前には失敗します。それ以外の場合は、モーダルが表示されず、最初のボタン要素が表示されない場合は失敗します。 –

答えて

1

あなたはモーダルが表示されるまで、それを閉じて、フォームを扱ういくつかの時間を待つことができます。

from selenium import webdriver 
from selenium.webdriver.support.ui import WebDriverWait as wait 
from selenium.webdriver.support import expected_conditions as EC 
from selenium.common.exceptions import TimeoutException 

url = "https://www.aircanada.com/ca/en/aco/home.html" 
control_profile = webdriver.FirefoxProfile('/path/to/my/profile') 
browser_control = webdriver.Firefox(control_profile) 

browser_control.get(url) 

# Wait up to 10 seconds until modal appears to close it 
try: 
    wait(browser_control, 10).until(EC.element_to_be_clickable(('xpath', '//button[text()="Confirm | Confirmer"]'))).click() 
# If modal didn't appear- just continue 
except TimeoutException: 
    pass 

departure = browser_control.find_element_by_xpath('//input[@placeholder="FROM"]') 
browser_control.execute_script('arguments[0].setAttribute("class","glyph-input glyph-left-input form-control ng-pristine ng-valid ng-touched");', departure) 
departure.send_keys("Berlin") 
wait(browser_control, 5).until(EC.visibility_of_element_located(("xpath", "(//div[@class='location-primary']/span)[1]"))) 
departure.send_keys(Keys.RETURN) 

destination = browser_control.find_element_by_xpath('//input[@placeholder="TO"]') 
browser_control.execute_script('arguments[0].setAttribute("class","glyph-input glyph-left-input form-control ng-pristine ng-valid ng-touched");', destination) 
destination.send_keys("Oslo") 
wait(browser_control, 5).until(EC.visibility_of_element_located(("xpath", "(//div[@class='location-primary']/span)[4]"))) 
destination.send_keys(Keys.RETURN) 
+0

答えがありがとう、とてもうまく働いたので、私はそれを受け入れたとマークしています。しかし、私は自分の問題が実際に返品が送られたときだと思っています。物理的に場所を入力してEnterキーを押すと、ドロップダウンの最初の要素が自動的に選択されます。しかし何らかの理由で、スクリプトで失敗するようです。あなたはそれを解決するための洞察を持っていますか? –

+0

私が注目したのは、この特定のdivに追加されたクラスが「隠されている」ことに気がつきましたが、実際の入力要素が不足していて、何を使うべきかわかりません。 –

+0

更新された回答を試してください – Andersson