5

要素が表示されないというエラーが表示されます。

ElementNotVisibleException: Message: u'Element is not currently visible and so may 
not be interacted with' 

このコードを実行すると、検索要素の行ごとに次のようになります。

from selenium import webdriver
browser = webdriver.Firefox()
browser.get('http://www.example.com')
browser.find_element_by_name('username').send_keys('myusername')
browser.find_element_by_name('password').send_keys('mypassword')
browser.find_element_by_class_name('welcomeLoginButton').click()

ページのログイン セクションの HTML は次のようになります。

<div class='welcomeLoginUsername'>
<div class='welcomeLoginUsernameLabel'><b>Username:</b></div>
<div class='welcomeLoginUsernameInput'><input type='text' name='username' tabindex='1'>
<br><a class='sf' href='javascript: void(0);' onclick='showUsernamePopup();'>
<b>Forgot Username?</b></a>
</div>
</div>
<div class='welcomeLoginPassword'>
<div class='welcomeLoginPasswordLabel'>
<b>Password:</b>
<br><span class='sf'>(It's cAsE sEnSitIvE!)</span>
</div>
<div class='welcomeLoginPasswordInput'>
<input type='password' name='password' tabindex='2'>
<br><a class='sf' href="javascript: void(0);" onclick="showPasswordPopup();">
<b>Forgot Password?</b></a>
</div>
</div>
</div>
<input type="submit" value="" class='welcomeLoginButton' style='border: 0px; 
padding: 0px; margin: 0px;) no-repeat;' onclick='document.forms["login"].submit()'>
4

1 に答える 1

6

Seleniumは、ユーザーと同じようにWebブラウザーと対話します。したがって、操作しようとしているhtml要素が表示されていない場合、最も簡単な説明は、セレンコードを記述しているときに、通常のユーザーのようにWebページを操作していないということです。

結局のところ、これはWebページのHTMLに関するものではなく、DOMと要素の非表示属性に関するものです。Firebugまたはその他のHTMLビューアプログラムをダウンロードしてから、押したいボタンを強調表示することをお勧めします。HTMLビューアのDOMルックアップを使用して、手動でサインインプロセスを実行します。要素と対話するために要素を表示するために何をしなければならないかに注意してください。次に、セレンコードの同じ手順を模倣します。

必要なことはすべて行ったが、JavaScriptが要素を表示するよりも速くセレンがWebページと対話しているという事実の問題である場合は、プログラムする必要がある待機があります。

素朴な方法:

import time
time.sleep(1) # this is done in seconds

よりスケーラブルな方法:

import time

welcome_button = browser.find_element_by_class_name('welcomeLoginButton')

wait_for_element_visibility(welcome_button).click()

def wait_for_element_visibility(element):
   if element.is_visible():
      return element
   else:
      for i in range(10):
         if not element.is_visible():
            time.sleep(.5)
         else:
            return element
于 2012-08-12T22:27:18.980 に答える