web-dev-qa-db-ja.com

セレンwaitForElement

Pythonでクラス識別子のみを持つテーブルを待機するSeleniumの関数を作成するにはどうすればよいですか?私は、SeleniumのPython webdriver関数を使用することを学ぶ時の悪魔を抱えています。

42
Breedly

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)
54
unutbu

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')
19
Dave Koo

私は以下を使用して良い経験をしました:

  • time.sleep(秒)
  • webdriver.Firefox.implicitly_wait(seconds)

最初のものはかなり明白です-いくつかのものを数秒待ってください。

私のすべてのSeleniumスクリプトでは、ラップトップで実行すると数秒(1から3の範囲)のsleep()が機能しますが、サーバーでは待機時間の範囲が広いため、implicitly_wait()も使用します。私は通常implicitly_wait(30)を使用しますが、これで十分です。

暗黙的な待機とは、1つまたは複数の要素がすぐに利用できない場合にそれらを見つけようとするときに、一定時間DOMをポーリングするようにWebDriverに指示することです。デフォルト設定は0です。一度設定されると、WebDriverオブジェクトインスタンスが存続する間、暗黙の待機が設定されます。

7
naeg

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;")

等.

3
Deven Kalra

ループで常に短いスリープを使用し、要素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
2
TheDawg

つかいます 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

何かを見逃していない限り、このために新しい関数を作成する必要はありません。

1
jro

これが役立つ場合...

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")
1
jcfollower

うまくいけば、これが役立つ

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
1
John LeComte

より簡単な解決策:

    from Selenium.webdriver.common.by import By    
    import time

    while len(driver.find_elements(By.ID, 'cs-paginate-next'))==0:
        time.sleep(100)
0
Ben

この関数をすべてのタイプの要素に変更できます。以下は、クラス要素専用です。

ここで、「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)
0
Diego Orellana

本質的に再帰的なカスタム関数を使用してこれを構築する簡単な方法を見つけました

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_idfind_element_by_nameまたはfind_element_by_tag_nameに置き換えることができます

0
Lalit Gehani

Seleniumコマンドについて何も知らない場合は、FirefoxでSelenium web idea RCを使用します。コンボボックスでコマンドを選択して追加し、テストケースを終了したら、テストコードを別の言語にエクスポートできます。 Java、Ruby、phyton、C#など。

0
onder.diri