Pythonでクラス識別子のみを持つテーブルを待機するSeleniumの関数を作成するにはどうすればよいですか?私は、SeleniumのPython webdriver関数を使用することを学ぶ時の悪魔を抱えています。
Selenium Documentation PDF から:
import contextlib
import Selenium.webdriver as webdriver
import Selenium.webdriver.support.ui as ui
with contextlib.closing(webdriver.Firefox()) as driver:
driver.get('http://www.google.com')
wait = ui.WebDriverWait(driver,10)
# Do not call `implicitly_wait` if using `WebDriverWait`.
# It magnifies the timeout.
# driver.implicitly_wait(10)
inputElement=driver.find_element_by_name('q')
inputElement.send_keys('Cheese!')
inputElement.submit()
print(driver.title)
wait.until(lambda driver: driver.title.lower().startswith('cheese!'))
print(driver.title)
# This raises
# Selenium.common.exceptions.TimeoutException: Message: None
# after 10 seconds
wait.until(lambda driver: driver.find_element_by_id('someId'))
print(driver.title)
Selenium 2のPythonバインディングには、要素が表示されているかどうかのテストなど、あらゆる種類のことを行うためのexpected_conditions.pyという新しいサポートクラスがあります。 こちらから入手可能
注:上記のファイルは2012年10月12日の時点でトランクにありますが、まだ2.25である最新のダウンロードにはまだありません。しばらくの間、新しいSeleniumバージョンがリリースされるまで、このファイルをローカルに保存して、以下で行ったようにインポートに含めることができます。
生活をもう少しシンプルにするために、これらの予想される条件メソッドのいくつかをSelenium wait until
Selenium 1で利用可能なものと同様の非常に便利な関数を作成するためのロジック。たとえば、これをSeleniumTestと呼ばれる私の基本クラスに入れ、Seleniumのすべてのテストクラスを拡張します。
from Selenium.common.exceptions import TimeoutException
from Selenium.webdriver.common.by import By
import Selenium.webdriver.support.expected_conditions as EC
import Selenium.webdriver.support.ui as ui
@classmethod
def setUpClass(cls):
cls.Selenium = WebDriver()
super(SeleniumTest, cls).setUpClass()
@classmethod
def tearDownClass(cls):
cls.Selenium.quit()
super(SeleniumTest, cls).tearDownClass()
# return True if element is visible within 2 seconds, otherwise False
def is_visible(self, locator, timeout=2):
try:
ui.WebDriverWait(driver, timeout).until(EC.visibility_of_element_located((By.CSS_SELECTOR, locator)))
return True
except TimeoutException:
return False
# return True if element is not visible within 2 seconds, otherwise False
def is_not_visible(self, locator, timeout=2):
try:
ui.WebDriverWait(driver, timeout).until_not(EC.visibility_of_element_located((By.CSS_SELECTOR, locator)))
return True
except TimeoutException:
return False
その後、次のようにテストでこれらを簡単に使用できます。
def test_search_no_city_entered_then_city_selected(self):
sel = self.Selenium
sel.get('%s%s' % (self.live_server_url, '/'))
self.is_not_visible('#search-error')
私は以下を使用して良い経験をしました:
最初のものはかなり明白です-いくつかのものを数秒待ってください。
私のすべてのSeleniumスクリプトでは、ラップトップで実行すると数秒(1から3の範囲)のsleep()が機能しますが、サーバーでは待機時間の範囲が広いため、implicitly_wait()も使用します。私は通常implicitly_wait(30)を使用しますが、これで十分です。
暗黙的な待機とは、1つまたは複数の要素がすぐに利用できない場合にそれらを見つけようとするときに、一定時間DOMをポーリングするようにWebDriverに指示することです。デフォルト設定は0です。一度設定されると、WebDriverオブジェクトインスタンスが存続する間、暗黙の待機が設定されます。
python Seleniumドライバーはこの関数をサポートしていないため、wait_for_conditionにはpythonに対して以下を実装しました。
def wait_for_condition(c):
for x in range(1,10):
print "Waiting for ajax: " + c
x = browser.execute_script("return " + c)
if(x):
return
time.sleep(1)
として使用される
ExtJS Ajax呼び出しが保留されていないことを待ちます。
wait_for_condition("!Ext.Ajax.isLoading()")
JavaScript変数が設定されています
wait_for_condition("CG.discovery != undefined;")
等.
ループで常に短いスリープを使用し、要素IDを渡すことができます。
def wait_for_element(element):
count = 1
if(self.is_element_present(element)):
if(self.is_visible(element)):
return
else:
time.sleep(.1)
count = count + 1
else:
time.sleep(.1)
count = count + 1
if(count > 300):
print("Element %s not found" % element)
self.stop
#prevents infinite loop
つかいます Wait Until Page Contains Element
適切なXPathロケーター。たとえば、次のHTMLがあるとします。
<body>
<div id="myDiv">
<table class="myTable">
<!-- implementation -->
</table>
</div>
</body>
...次のキーワードを入力できます。
Wait Until Page Contains Element //table[@class='myTable'] 5 seconds
何かを見逃していない限り、このために新しい関数を作成する必要はありません。
これが役立つ場合...
Selenium IDEで、...コマンド:waitForElementPresentターゲット:// table [@ class = 'pln']を追加しました。
次に、File> Export TestCase As Python2(Web Driver)を実行しました。
def test_sel(self):
driver = self.driver
for i in range(60):
try:
if self.is_element_present(By.XPATH, "//table[@class='pln']"): break
except: pass
time.sleep(1)
else: self.fail("time out")
うまくいけば、これが役立つ
from Selenium import webdriver
from Selenium.webdriver.support import expected_conditions as EC
from Selenium.webdriver.support.wait import WebDriverWait
from Selenium.webdriver.common.by import By
driver = webdriver.Firefox()
driver.get('www.url.com')
try:
wait = driver.WebDriverWait(driver,10).until(EC.presence_of_element_located(By.CLASS_NAME,'x'))
except:
pass
より簡単な解決策:
from Selenium.webdriver.common.by import By
import time
while len(driver.find_elements(By.ID, 'cs-paginate-next'))==0:
time.sleep(100)
この関数をすべてのタイプの要素に変更できます。以下は、クラス要素専用です。
ここで、「driver」はドライバー、「element_name」は探しているクラス名、「sec」は待機する最大秒数です。
def wait_for_class_element(driver,element_name,sec):
for i in range(sec):
try:
driver.find_element_by_class_name(element_name)
break
except:
print("not yet")
time.sleep(1)
本質的に再帰的なカスタム関数を使用してこれを構築する簡単な方法を見つけました
from Selenium import webdriver
import time
def wait_element_by_id(id_value):
try:
elem = driver.find_element_by_id(id_value)
except:
time.sleep(2)
print 'Waiting for id '+id_value
wait_element_by_id(id_value)
要件に応じて、find_element_by_id
をfind_element_by_name
またはfind_element_by_tag_name
に置き換えることができます
Seleniumコマンドについて何も知らない場合は、FirefoxでSelenium web idea RCを使用します。コンボボックスでコマンドを選択して追加し、テストケースを終了したら、テストコードを別の言語にエクスポートできます。 Java、Ruby、phyton、C#など。