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.
93 lines
3.2 KiB
93 lines
3.2 KiB
# -*- coding: utf-8 -*-
|
|
|
|
from selenium.webdriver.support.ui import WebDriverWait
|
|
from selenium.webdriver.support import expected_conditions as EC
|
|
|
|
|
|
class ElementIn(object):
|
|
|
|
default_find_fn = 'find_element'
|
|
|
|
def __init__(self, element, locator, find_fn=None):
|
|
self.element = element
|
|
self.locator = locator
|
|
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.locator)
|
|
except:
|
|
return False
|
|
|
|
|
|
class ElementsIn(ElementIn):
|
|
|
|
default_find_fn = 'find_elements'
|
|
|
|
|
|
class SeleniumExtensions(object):
|
|
|
|
@classmethod
|
|
def wait_elem(cls, driver, locator, inside_el=None, wait_time=10):
|
|
if inside_el:
|
|
return WebDriverWait(driver, wait_time).until(ElementIn(inside_el, locator))
|
|
return WebDriverWait(driver, wait_time).until(
|
|
EC.presence_of_element_located(locator)
|
|
)
|
|
|
|
@classmethod
|
|
def wait_elems(cls, driver, locator, inside_el=None, wait_time=10):
|
|
if inside_el:
|
|
return WebDriverWait(driver, wait_time).until(ElementsIn(inside_el, locator))
|
|
return WebDriverWait(driver, wait_time).until(
|
|
EC.presence_of_all_elements_located(locator)
|
|
)
|
|
|
|
@classmethod
|
|
def wait_for_js_load(cls, driver, wait_time=10):
|
|
WebDriverWait(driver, wait_time).until(
|
|
lambda driver: driver.execute_script('return document.readyState') == 'complete')
|
|
|
|
@classmethod
|
|
def add_requests_log(cls, driver):
|
|
js = '''
|
|
(function() {
|
|
var open = XMLHttpRequest.prototype.open;
|
|
var send = XMLHttpRequest.prototype.send;
|
|
window._requestsLog = [];
|
|
window._findRequest = function(pathOrXHR){
|
|
for(var i=window._requestsLog.length - 1; i >= 0; i--){
|
|
var request = window._requestsLog[i];
|
|
if(typeof(pathOrXHR) == 'string' && request[1].indexOf(pathOrXHR) > -1
|
|
|| request[2] === pathOrXHR){
|
|
return request;
|
|
}
|
|
}
|
|
}
|
|
XMLHttpRequest.prototype.open = function(method, url){
|
|
window._requestsLog.push([method, url, this]);
|
|
return open.apply(this, arguments);
|
|
}
|
|
XMLHttpRequest.prototype.send = function(body){
|
|
var r = window._findRequest(this);
|
|
if(r){
|
|
r.push(body);
|
|
}
|
|
return send.apply(this, arguments);
|
|
}
|
|
})();
|
|
'''
|
|
return driver.execute_script(js)
|
|
|
|
@classmethod
|
|
def get_requests(cls, driver):
|
|
return driver.execute_script('return window._requestsLog;')
|
|
|
|
@classmethod
|
|
def wait_for_request(cls, driver, path, wait_time=10):
|
|
WebDriverWait(driver, wait_time).until(
|
|
lambda driver: driver.execute_script('''
|
|
var r = window._findRequest(arguments[0]);
|
|
return !!r && r[2].readyState == 4;
|
|
''', path) is True)
|
|
return driver.execute_script('return window._findRequest(arguments[0]);', path)
|
|
|