Как написать функцию Selenium для ожидания таблицы с просто идентификатором класса в Python? У меня чертовски время учится использовать функции webdriver Selenium Python.
Selenium waitForElement
Ответ 1
Из Документация документации 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)
Ответ 2
Связи Selenium 2 Python имеют новый класс поддержки, называемый expect_conditions.py, для выполнения всех видов, таких как тестирование, если элемент видим. Это доступно здесь.
ПРИМЕЧАНИЕ. указанный выше файл находится в багажнике по состоянию на 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')
Ответ 3
Я сделал хороший опыт, используя:
- time.sleep(секунды)
- webdriver.Firefox.implicitly_wait (секунды)
Первый из них довольно очевиден - подождите несколько секунд для некоторых вещей.
Для всех моих Selenium Scripts спящий режим() с несколькими секундами (от 1 до 3) работает, когда я запускаю их на своем ноутбуке, но на моем сервере время ожидания имеет более широкий диапазон, поэтому я использую implicitly_wait ( ) слишком. Обычно я использую implicitly_wait (30), что действительно достаточно.
Неявное ожидание означает, что WebDriver должен опросить DOM в течение определенного времени при попытке найти элемент или элементы, если они не доступны сразу. Значение по умолчанию равно 0. После установки неявного ожидания устанавливается срок жизни экземпляра объекта WebDriver.
Ответ 4
Я выполнил следующее для python для wait_for_condition, так как драйвер selenium 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;")
и др.
Ответ 5
Вы всегда можете использовать короткий сон в цикле и передать ему свой идентификатор элемента:
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
Ответ 6
Используйте 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
Если я что-то пропустил, нет необходимости создавать для этого новую функцию.
Ответ 7
В случае, если это помогает...
В Selenium IDE я добавил... Команда: waitForElementPresent Цель://таблица [@ class= 'pln']
Затем я сделал File > Export TestCase как 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")
Ответ 8
Надеюсь, это поможет
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
Ответ 9
Если я ничего не знаю о команде selenium, я использую selenium web idea RC с firefox. Вы можете выбрать и добавить команду в поле со списком и завершить свой тестовый пример после того, как вы можете экспортировать тестовый код на другой язык. например, java, ruby, phyton, С# и т.д.
Ответ 10
проще:
from selenium.webdriver.common.by import By
import time
while len(driver.find_elements(By.ID, 'cs-paginate-next'))==0:
time.sleep(100)
Ответ 11
Вы можете изменить эту функцию на все типы элементов. Ниже приведен только элемент класса:
Если "драйвер" является драйвером, "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)
Ответ 12
Я нашел более простой способ построить это с помощью пользовательской функции, которая по своей природе рекурсивна
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
зависимости от ваших требований
Ответ 13
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
# wait until present
WebDriverWait(driver, waittime).until(
EC.presence_of_element_located((By.CSS_SELECTOR, css_selector))
)
# wait until visible
WebDriverWait(driver, waittime).until(
EC.visibility_of_element_located((By.CSS_SELECTOR, css_selector))
)
Ответ 14
WebDriverWait wait = new WebDriverWait(driver, timeout/1000);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath(element)));