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