2016-08-23 8 views
1

テストしているWebアプリケーションのホームページには、最初に読み込んだときに読み込み画面が表示され、ユーザー名/パスワードボックスが表示されます。これは動的に生成されたUI要素であり、カーソルはデフォルトでusernameフィールドの内側にあります。Webページが1つの動的ページに含まれ、Selenium(Python)とのドライバ対話を使用できません

私は周りを見回し、誰かがアクションチェーンを使って提案しました。アクションチェーンを使用すると、すぐにユーザー名とパスワードのフィールドにテキストを入力してEnterキーを押すと、次のページが正常に読み込まれます。残念ながら、アクションチェーンは、私の特別なセットアップのために私にとっては実行可能な長期的な答えではありません。

webdriverのfind_element_by_idを使用すると、何とか見えないので、私はそれを見つけることができ、send_keysを要素に使用することはできません。私は受け取る

selenium.common.exceptions.ElementNotVisibleException:メッセージ:要素が表示されません。

また、このエラーを表示せずにフィールドをクリックしたり、他の方法で操作したりすることはできません。

私はまた、 "xpaths"やcssのような他の手段を使って要素を特定したり相互作用したりしてみましたが、役に立たなかった。それらは常にnot visibleです。

不思議なことに、それは動的ページタイトルで動作します。ページが最初にロードされるときにはLoading...であり、終了するとLoginになります。 driver.titleが呼び出されると、ドライバは現在のタイトルを返します。

誰かに提案がありますか?実際

+0

あなたが要素を見つけようとしているときに、ログインページに進行状況バーが表示されていることを確認しますか? –

+0

はい、あります。私はログインボックスが表示されるのに十分な時間である、それと対話しようとする前にtime.sleep(20)を入れました。 – JRodge01

+0

実際には、DOM上に存在する要素をチェックしているかどうか、または存在していないかどうかは、presence_of_element_locatedが存在しているかどうかだけを見ることができる一方で、visible_of_element_locatedが存在し、 –

答えて

1

ロードプログレスバーがある場合、ページにログインあなたの中に表示され、あなたが要素は以下のように見えつつあるまで待機するWebDriverWaitを使用してみてくださいは: -

from selenium import webdriver 
from selenium.webdriver.common.by import By 
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC 

wait = WebDriverWait(driver, 10) 

element = wait.until(EC.visibility_of_element_located((By.ID, "enter element id here"))) 

# now use send_keys 
element.send_keys("enter value here") 

Edited1: - あなたが取得している場合TimeoutException、私はあなたが以下のように欲望の要素を見つけるウェイト代わりにハードコードされた睡眠のWebDriverWaitを使用して目に見えないロードプログレスバーするために要素を見つける前に待機するようにしようと示唆している: -

wait = WebDriverWait(driver, 10) 

wait.until(EC.invisibility_of_element_located((By.ID, "enter loading progress bar id or other locators here"))) 

#now after invisible of loading progress bar wait for desire element 
element = wait.until(EC.presence_of_element_located((By.ID, "enter element id here"))) 

# now use send_keys 
element.send_keys("enter value here") 

Edited2は: - 要素の実際presence_of_element_locatedだけvisibility_of_element_locatedが存在し、両方の目に見える確認しながら、DOMに存在するかどうかの要素をチェックし、視認性がそれはなぜpresence_of_element_located作品だだけ見え取得しながら、隠された要素だけでなく、目に見える要素を見つけることもできpresence_of_element_locatedを意味し、 。今

send_keys時の問題は、それはあなたが困っている理由です表示されていないまで、セレンは、要素にintractことができないためには、なぜそれと相互作用するセレンができないことがあります、それは目に見えない可能願望要素のいくつかの隠しCSS作品がありますすることができますexecute_scriptを使用して値を設定できることを心配しないでください。 1 self.waitを使用し、saurabhによって示唆されるように

driver.execute_script("arguments[0].value = arguments[1]", element, "enter your value here") 
+0

ハードコードされた待機を使用して、要素が画面に表示されていることを確認してから、提案した内容を実行しました。この要素は、画面やソースではっきりと表示されますが、wait.until()によって生成されたTimeoutExceptionがまだ表示されます。フレームの切り替えを試してみました。新しいソースや何かを登録するためにセレンのために何かリフレッシュする必要はありますか? – JRodge01

+0

それでは、ハードコードされた待機の代わりに、WebDriverWaitを使用して、バーを表示してから非表示にし、要素を見つけて、編集した回答を試してみてください... :) –

+0

私はそれをやってみました。ローディングバーを見つけて、目に見えなくなってもユーザー名とパスワードのフィールドを見つけることができないことに気づくでしょう。私は、この部分にアクションチェーンを使用し、サイトの他の部分を自動化して、どこに遭遇する問題であるかを確認しようと考えています。 – JRodge01

0

- :

今、あなたは代わりとして見つけ要素の後send_keysを使用しての入力要素に値を設定してみてください。(EC.visibility_of_element_located((By.CSS_SELECTOR、OR.Sub_categories)))までエルス

あなたは、ページの読み込み

時の変化を持っているXPathをすることができ、睡眠を入れて、しかし、それを使用することはお勧めできません見ます
+0

私は、要素が画面上にあることを確認してから、EC.visibility関数でその要素を特定しようとするまで、明示的な待機を使用することを含め、両方を試みました。それでも、ボックスを見つけることはできません。 – JRodge01

関連する問題