Selenium waitForElement - PullRequest
       20

Selenium waitForElement

42 голосов
/ 16 октября 2011

Как мне написать функцию для Selenium для ожидания таблицы только с идентификатором класса в Python? У меня дьявол времени учится использовать функции веб-драйвера Selenium Python.

Ответы [ 12 ]

49 голосов
/ 14 января 2012

Из документации 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)
19 голосов
/ 25 октября 2012

Привязки Python в Selenium 2 имеют новый класс поддержки с именем Ожидаемый_кондиционирование для выполнения всех видов операций, таких как проверка, видим ли элемент. Это доступно здесь.

ПРИМЕЧАНИЕ. указанный выше файл находится в стволе по состоянию на 12 октября 2012 г., но еще не загружен в последнюю версию, которая по-прежнему составляет 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')
7 голосов
/ 16 октября 2011

Я сделал хороший опыт, используя:

  • time.sleep (секунды)
  • webdriver.Firefox.implicitly_wait (секунды)

Первый довольно очевиден - просто подождите несколько секунд для чего-нибудь.

Для всех моих сценариев Selenium функция sleep () с несколькими секундами (в диапазоне от 1 до 3) работает, когда я запускаю их на своем ноутбуке, но на моем сервере время ожидания имеет более широкий диапазон, поэтому я использую implicitly_wait ( ) тоже. Я обычно использую implicitly_wait (30), чего вполне достаточно.

Неявное ожидание состоит в том, чтобы указать WebDriver опросить DOM в течение определенного периода времени при попытке найти элемент или элементы, если они не доступны сразу. Значение по умолчанию равно 0. После установки устанавливается неявное ожидание в течение срока службы экземпляра объекта WebDriver.

2 голосов
/ 08 ноября 2011

Я реализовал следующее для python для wait_for_condition, поскольку драйвер python selenium не поддерживает эту функцию.

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

и т.д.

1 голос
/ 30 ноября 2016

Надеюсь, это поможет

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 голос
/ 22 февраля 2012

Вы всегда можете использовать короткий сон в цикле и передать его свой идентификатор элемента:

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 голос
/ 18 октября 2011

На случай, если это поможет ...

В Selenium IDE я добавил ... Команда: waitForElementPresent Цель: // table [@ class = 'pln']

Тогда ясделал File> Export TestCase As Python2 (веб-драйвер), и он дал мне это ...

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 голос
/ 17 октября 2011

Используйте 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

Если я что-то пропустил, нет необходимости создавать новую функциюдля этого.

0 голосов
/ 27 мая 2019

Я нашел более простой способ создать это с помощью пользовательской функции, которая является рекурсивной по своей природе

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 в зависимости от ваших требований

0 голосов
/ 17 октября 2017

Вы можете изменить эту функцию для всех типов элементов.Ниже приведено только для элемента класса:

Где «драйвер» - это драйвер, «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)
...