You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

50 lines
1.6 KiB

# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
class elem_in(object):
default_find_fn = 'find_element_by_xpath'
def __init__(self, element, xpath, find_fn=None):
self.element = element
self.xpath = xpath
self.find_fn = self.default_find_fn if find_fn is None else find_fn
def __call__(self, driver):
try:
return getattr(self.element, self.find_fn)(self.xpath)
except:
return False
class elems_in(elem_in):
default_find_fn = 'find_elements_by_xpath'
class SeleniumExtensions(object):
@classmethod
def wait_elem(cls, driver, xpath, inside_el=None, wait_time=10):
if inside_el:
return WebDriverWait(driver, wait_time).until(elem_in(inside_el, xpath))
if xpath[:2] != '//':
raise Exception('XPath in wait_elem must start with //')
return WebDriverWait(driver, wait_time).until(
EC.presence_of_element_located(
(By.XPATH, xpath)
)
)
@classmethod
def wait_elems(cls, driver, xpath, inside_el=None, wait_time=10):
if inside_el:
return WebDriverWait(driver, wait_time).until(elems_in(inside_el, xpath))
if xpath[:2] != '//':
raise Exception('XPath in wait_elems must start with //')
return WebDriverWait(driver, wait_time).until(
EC.presence_of_all_elements_located(
(By.XPATH, xpath)
)
)