@@ -36,6 +36,7 @@ def test_anything(self):
36
36
from bs4 import BeautifulSoup
37
37
from pyvirtualdisplay import Display
38
38
from seleniumbase .common import decorators
39
+ from seleniumbase .config import ad_block_list
39
40
from seleniumbase .config import settings
40
41
from seleniumbase .core .application_manager import ApplicationManager
41
42
from seleniumbase .core .s3_manager import S3LoggingBucket
@@ -75,13 +76,15 @@ def __init__(self, *args, **kwargs):
75
76
self .driver = None
76
77
self .environment = None
77
78
self ._last_url_of_delayed_assert = "data:,"
79
+ self ._last_page_load_url = "data:,"
78
80
self ._page_check_count = 0
79
81
self ._page_check_failures = []
80
82
self ._html_report_extra = []
81
83
self ._default_driver = None
82
84
self ._drivers_list = []
83
85
84
86
def open (self , url ):
87
+ self ._last_page_load_url = None
85
88
self .driver .get (url )
86
89
if settings .WAIT_FOR_RSC_ON_PAGE_LOADS :
87
90
self .wait_for_ready_state_complete ()
@@ -411,11 +414,13 @@ def get_attribute(self, selector, attribute, by=By.CSS_SELECTOR,
411
414
selector , attribute ))
412
415
413
416
def refresh_page (self ):
417
+ self ._last_page_load_url = None
414
418
self .driver .refresh ()
419
+ self .wait_for_ready_state_complete ()
415
420
416
421
def refresh (self ):
417
422
""" The shorter version of self.refresh_page() """
418
- self .driver . refresh ()
423
+ self .refresh_page ()
419
424
420
425
def get_current_url (self ):
421
426
return self .driver .current_url
@@ -431,10 +436,14 @@ def get_title(self):
431
436
return self .driver .title
432
437
433
438
def go_back (self ):
439
+ self ._last_page_load_url = None
434
440
self .driver .back ()
441
+ self .wait_for_ready_state_complete ()
435
442
436
443
def go_forward (self ):
444
+ self ._last_page_load_url = None
437
445
self .driver .forward ()
446
+ self .wait_for_ready_state_complete ()
438
447
439
448
def get_image_url (self , selector , by = By .CSS_SELECTOR ,
440
449
timeout = settings .SMALL_TIMEOUT ):
@@ -978,6 +987,19 @@ def remove_elements(self, selector, by=By.CSS_SELECTOR):
978
987
remove_script = """jQuery('%s').remove()""" % selector
979
988
self .safe_execute_script (remove_script )
980
989
990
+ def ad_block (self ):
991
+ for css_selector in ad_block_list .AD_BLOCK_LIST :
992
+ css_selector = re .escape (css_selector )
993
+ script = ("""var $elements = document.querySelectorAll('%s');
994
+ var index = 0, length = $elements.length;
995
+ for(; index < length; index++){
996
+ $elements[index].remove();}"""
997
+ % css_selector )
998
+ try :
999
+ self .execute_script (script )
1000
+ except Exception :
1001
+ pass # Don't fail test if ad_blocking fails
1002
+
981
1003
def jq_format (self , code ):
982
1004
# DEPRECATED - Use re.escape() instead, which does the action you want.
983
1005
return page_utils ._jq_format (code )
@@ -1077,6 +1099,8 @@ def set_value(self, selector, new_value, by=By.CSS_SELECTOR,
1077
1099
element = self .wait_for_element_present (
1078
1100
orginal_selector , by = by , timeout = timeout )
1079
1101
element .send_keys (Keys .RETURN )
1102
+ if settings .WAIT_FOR_RSC_ON_PAGE_LOADS :
1103
+ self .wait_for_ready_state_complete ()
1080
1104
self ._demo_mode_pause_if_active ()
1081
1105
1082
1106
def jquery_update_text_value (self , selector , new_value , by = By .CSS_SELECTOR ,
@@ -1441,6 +1465,17 @@ def wait_for_ready_state_complete(self, timeout=settings.EXTREME_TIMEOUT):
1441
1465
is_ready = page_actions .wait_for_ready_state_complete (self .driver ,
1442
1466
timeout )
1443
1467
self .wait_for_angularjs (timeout = settings .MINI_TIMEOUT )
1468
+ if self .ad_block_on :
1469
+ # If the ad_block feature is enabled, then block ads for new URLs
1470
+ current_url = self .get_current_url ()
1471
+ if not current_url == self ._last_page_load_url :
1472
+ time .sleep (0.02 )
1473
+ self .ad_block ()
1474
+ time .sleep (0.01 )
1475
+ if self .is_element_present ("iframe" ):
1476
+ time .sleep (0.07 ) # iframe ads take slightly longer to load
1477
+ self .ad_block () # Do ad_block on slower-loading iframes
1478
+ self ._last_page_load_url = current_url
1444
1479
return is_ready
1445
1480
1446
1481
def wait_for_angularjs (self , timeout = settings .LARGE_TIMEOUT , ** kwargs ):
@@ -1896,6 +1931,7 @@ def setUp(self):
1896
1931
self .demo_mode = pytest .config .option .demo_mode
1897
1932
self .demo_sleep = pytest .config .option .demo_sleep
1898
1933
self .highlights = pytest .config .option .highlights
1934
+ self .ad_block_on = pytest .config .option .ad_block_on
1899
1935
self .verify_delay = pytest .config .option .verify_delay
1900
1936
self .timeout_multiplier = pytest .config .option .timeout_multiplier
1901
1937
self .use_grid = False
0 commit comments