it-swarm-id.com

Selenium waitForElement

Bagaimana cara menulis fungsi untuk Selenium untuk menunggu tabel dengan hanya pengenal kelas di Python? Saya memiliki setan waktu belajar menggunakan fungsi webdriver Python Selenium.

41
Breedly

Dari Dokumentasi Selenium 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)
47
unutbu

Binding Python Selenium 2 memiliki kelas dukungan baru yang disebut expected_conditions.py untuk melakukan segala macam hal seperti menguji apakah suatu elemen terlihat. Itu tersedia di sini.

CATATAN: file di atas berada di bagasi pada 12 Oktober 2012, tetapi belum dalam unduhan terbaru yang masih 2,25. Untuk saat ini hingga versi Selenium baru dirilis, Anda dapat menyimpan file ini secara lokal untuk saat ini dan memasukkannya ke dalam impor Anda seperti yang telah saya lakukan di bawah ini.

Untuk membuat hidup sedikit lebih sederhana, Anda dapat menggabungkan beberapa metode kondisi yang diharapkan ini dengan logika Selenium wait until untuk membuat beberapa fungsi yang sangat mirip dengan apa yang tersedia di Selenium 1. Misalnya, saya memasukkan ini ke kelas dasar saya yang disebut SeleniumTest yang semuanya dari kelas tes Selenium saya memperpanjang:

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

Anda kemudian dapat menggunakan ini dengan mudah dalam tes Anda seperti:

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

Saya telah membuat pengalaman yang baik menggunakan:

  • time.sleep (detik)
  • webdriver.Firefox.implicitly_wait (detik)

Yang pertama cukup jelas - tunggu beberapa detik untuk beberapa hal.

Untuk semua Selenium Script saya, sleep () dengan beberapa detik (berkisar dari 1 hingga 3) berfungsi ketika saya menjalankannya di laptop saya, tetapi pada Server saya waktu untuk menunggu memiliki rentang yang lebih luas, jadi saya juga menggunakan implisit implisit (menunggu). Saya biasanya menggunakan implisit (menunggu) 30, yang benar-benar cukup.

Penantian implisit adalah memberi tahu WebDriver untuk melakukan polling DOM selama waktu tertentu ketika mencoba menemukan elemen atau elemen jika tidak segera tersedia. Pengaturan default adalah 0. Setelah diatur, tunggu implisit diatur selama umur instance objek WebDriver.

7
naeg

Saya menerapkan berikut ini untuk python untuk wait_for_condition karena driver python Selenium tidak mendukung fungsi ini.

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)

untuk digunakan sebagai

Tunggu panggilan ExtJS Ajax tidak tertunda:

wait_for_condition("!Ext.Ajax.isLoading()")

Variabel Javascript diatur

wait_for_condition("CG.discovery != undefined;")

dll.

2
Deven Kalra

Gunakan Wait Until Page Contains Element dengan locator XPath yang tepat. Misalnya, diberikan HTML berikut:

<body>
  <div id="myDiv">
    <table class="myTable">
      <!-- implementation -->
    </table>
  </div>
</body>

... Anda dapat memasukkan kata kunci berikut:

Wait Until Page Contains Element  //table[@class='myTable']  5 seconds

Kecuali saya melewatkan sesuatu, tidak perlu membuat fungsi baru untuk ini.

1
jro

Dalam hal ini membantu ...

Di Selenium IDE, saya menambahkan ... Perintah: waitForElementPresent Target: // table [@ class = 'pln']

Lalu saya melakukan File> Export TestCase As Python2 (Web Driver), dan itu memberi saya ini ...

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

Semoga ini bisa membantu

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

Anda selalu dapat menggunakan tidur singkat dalam satu lingkaran dan memberikannya id elemen Anda:

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
1
TheDawg

solusi yang lebih mudah: 

    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

Anda dapat memodifikasi fungsi ini untuk semua jenis elemen. Yang di bawah ini hanya untuk elemen kelas:

Di mana "driver" adalah drivernya, "element_name" adalah nama kelas yang Anda cari, dan "sec" adalah jumlah detik maksimum yang ingin Anda tunggu.

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

Jika saya tidak tahu sesuatu tentang perintah Selenium, saya menggunakan web ide Selenium RC dengan firefox. Anda dapat memilih dan menambahkan perintah di kotak kombo dan ketika menyelesaikan kasus pengujian Anda setelah Anda dapat mengekspor kode tes bahasa yang berbeda. seperti Java, Ruby, phyton, C #, dll.

0
onder.diri