Skip to content

Commit 7211a2c

Browse files
authored
Merge pull request #504 from seleniumbase/update-settings-parser
Update the way custom settings are parsed
2 parents cfd53fa + 5e1a6ac commit 7211a2c

File tree

8 files changed

+72
-68
lines changed

8 files changed

+72
-68
lines changed

examples/custom_settings.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,16 +52,17 @@
5252

5353
# MySQL DB Credentials
5454
# (For saving data from tests to a MySQL DB)
55-
# Add "--with-db_reporting" to save test data to a MySQL DB during test runs
55+
# Usage: "--with-db_reporting"
5656
DB_HOST = "127.0.0.1"
57+
DB_PORT = 3306
5758
DB_USERNAME = "root"
5859
DB_PASSWORD = "test"
5960
DB_SCHEMA = "test_db"
6061

6162
# Amazon S3 Bucket Credentials
6263
# (For saving screenshots and other log files from tests)
6364
# (Bucket names are unique across all existing bucket names in Amazon S3)
64-
# Add "--with-s3_logging" to save test results to S3
65+
# Usage: "--with-s3_logging"
6566
S3_LOG_BUCKET = "[S3 BUCKET NAME]"
6667
S3_BUCKET_URL = "https://s3.amazonaws.com/[S3 BUCKET NAME]/"
6768
S3_SELENIUM_ACCESS_KEY = "[S3 ACCESS KEY]"

help_docs/method_summary.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -268,7 +268,7 @@ self.jquery_update_text(selector, new_value, by=By.CSS_SELECTOR, timeout=None)
268268

269269
self.set_time_limit(time_limit)
270270

271-
self.skip_test(reason="")
271+
self.skip(reason="")
272272

273273
########
274274

seleniumbase/config/settings.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,8 +121,10 @@
121121

122122

123123
# MySQL DB Credentials
124-
# (For saving data from tests)
124+
# (For saving data from tests to a MySQL DB)
125+
# Usage: "--with-db_reporting"
125126
DB_HOST = "127.0.0.1"
127+
DB_PORT = 3306
126128
DB_USERNAME = "root"
127129
DB_PASSWORD = "test"
128130
DB_SCHEMA = "test_db"
@@ -131,6 +133,7 @@
131133
# Amazon S3 Bucket Credentials
132134
# (For saving screenshots and other log files from tests)
133135
# (Bucket names are unique across all existing bucket names in Amazon S3)
136+
# Usage: "--with-s3_logging"
134137
S3_LOG_BUCKET = "[S3 BUCKET NAME]"
135138
S3_BUCKET_URL = "https://s3.amazonaws.com/[S3 BUCKET NAME]/"
136139
S3_SELENIUM_ACCESS_KEY = "[S3 ACCESS KEY]"

seleniumbase/core/mysql.py

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33
"""
44

55
import time
6-
from seleniumbase.core import mysql_conf as conf
6+
from seleniumbase import config as sb_config
7+
from seleniumbase.config import settings
8+
from seleniumbase.core import settings_parser
79

810

911
class DatabaseManager():
@@ -13,17 +15,33 @@ class DatabaseManager():
1315

1416
def __init__(self, database_env='test', conf_creds=None):
1517
"""
16-
Gets database information from mysql_conf.py and creates a connection.
18+
Create a connection to the MySQL DB.
1719
"""
1820
import pymysql
19-
db_server, db_user, db_pass, db_schema = \
20-
conf.APP_CREDS[conf.Apps.TESTCASE_REPOSITORY][database_env]
21+
db_server = settings.DB_HOST
22+
db_port = settings.DB_PORT
23+
db_user = settings.DB_USERNAME
24+
db_pass = settings.DB_PASSWORD
25+
db_schema = settings.DB_SCHEMA
26+
if sb_config.settings_file:
27+
override = settings_parser.set_settings(sb_config.settings_file)
28+
if "DB_HOST" in override.keys():
29+
db_server = override['DB_HOST']
30+
if "DB_PORT" in override.keys():
31+
db_port = override['DB_PORT']
32+
if "DB_USERNAME" in override.keys():
33+
db_user = override['DB_USERNAME']
34+
if "DB_PASSWORD" in override.keys():
35+
db_pass = override['DB_PASSWORD']
36+
if "DB_SCHEMA" in override.keys():
37+
db_schema = override['DB_SCHEMA']
2138
retry_count = 3
2239
backoff = 1.2 # Time to wait (in seconds) between retries.
2340
count = 0
2441
while count < retry_count:
2542
try:
2643
self.conn = pymysql.connect(host=db_server,
44+
port=db_port,
2745
user=db_user,
2846
passwd=db_pass,
2947
db=db_schema)

seleniumbase/core/mysql_conf.py

Lines changed: 0 additions & 25 deletions
This file was deleted.

seleniumbase/fixtures/base_case.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1718,7 +1718,7 @@ def highlight_update_text(self, selector, new_value, by=By.CSS_SELECTOR,
17181718
self.update_text(selector, new_value, by=by)
17191719

17201720
def highlight(self, selector, by=By.CSS_SELECTOR,
1721-
loops=settings.HIGHLIGHTS, scroll=True):
1721+
loops=None, scroll=True):
17221722
""" This method uses fancy JavaScript to highlight an element.
17231723
Used during demo_mode.
17241724
@Params
@@ -1731,6 +1731,8 @@ def highlight(self, selector, by=By.CSS_SELECTOR,
17311731
selector, by = self.__recalculate_selector(selector, by)
17321732
element = self.wait_for_element_visible(
17331733
selector, by=by, timeout=settings.SMALL_TIMEOUT)
1734+
if not loops:
1735+
loops = settings.HIGHLIGHTS
17341736
if scroll:
17351737
try:
17361738
self.__slow_scroll_to_element(element)
@@ -2503,7 +2505,7 @@ def set_time_limit(self, time_limit):
25032505
sb_config.time_limit = None
25042506
sb_config.time_limit_ms = None
25052507

2506-
def skip_test(self, reason=""):
2508+
def skip(self, reason=""):
25072509
""" Mark the test as Skipped. """
25082510
self.skipTest(reason)
25092511

seleniumbase/masterqa/master_qa.py

Lines changed: 37 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,6 @@
99
from seleniumbase.config import settings
1010
from seleniumbase.fixtures import js_utils
1111

12-
LATEST_REPORT_DIR = settings.LATEST_REPORT_DIR
13-
ARCHIVE_DIR = settings.REPORT_ARCHIVE_DIR
14-
RESULTS_PAGE = settings.HTML_REPORT
15-
BAD_PAGE_LOG = settings.RESULTS_TABLE
16-
DEFAULT_VALIDATION_MESSAGE = settings.MASTERQA_DEFAULT_VALIDATION_MESSAGE
17-
WAIT_TIME_BEFORE_VERIFY = settings.MASTERQA_WAIT_TIME_BEFORE_VERIFY
18-
START_IN_FULL_SCREEN_MODE = settings.MASTERQA_START_IN_FULL_SCREEN_MODE
19-
MAX_IDLE_TIME_BEFORE_QUIT = settings.MASTERQA_MAX_IDLE_TIME_BEFORE_QUIT
20-
2112
# This tool allows testers to quickly verify pages while assisted by automation
2213

2314

@@ -27,10 +18,22 @@ def setUp(self):
2718
self.check_count = 0
2819
self.auto_close_results_page = False
2920
super(MasterQA, self).setUp(masterqa_mode=True)
21+
self.LATEST_REPORT_DIR = settings.LATEST_REPORT_DIR
22+
self.ARCHIVE_DIR = settings.REPORT_ARCHIVE_DIR
23+
self.RESULTS_PAGE = settings.HTML_REPORT
24+
self.BAD_PAGE_LOG = settings.RESULTS_TABLE
25+
self.DEFAULT_VALIDATION_MESSAGE = (
26+
settings.MASTERQA_DEFAULT_VALIDATION_MESSAGE)
27+
self.WAIT_TIME_BEFORE_VERIFY = (
28+
settings.MASTERQA_WAIT_TIME_BEFORE_VERIFY)
29+
self.START_IN_FULL_SCREEN_MODE = (
30+
settings.MASTERQA_START_IN_FULL_SCREEN_MODE)
31+
self.MAX_IDLE_TIME_BEFORE_QUIT = (
32+
settings.MASTERQA_MAX_IDLE_TIME_BEFORE_QUIT)
3033
self.__manual_check_setup()
3134
if self.headless:
3235
self.auto_close_results_page = True
33-
if START_IN_FULL_SCREEN_MODE:
36+
if self.START_IN_FULL_SCREEN_MODE:
3437
self.maximize_window()
3538

3639
def verify(self, *args):
@@ -73,26 +76,28 @@ def __manual_check_setup(self):
7376
def __clear_out_old_logs(
7477
self, archive_past_runs=True, get_log_folder=False):
7578
abs_path = os.path.abspath('.')
76-
file_path = abs_path + "/%s" % LATEST_REPORT_DIR
79+
file_path = abs_path + "/%s" % self.LATEST_REPORT_DIR
7780
if not os.path.exists(file_path):
7881
os.makedirs(file_path)
7982

8083
if archive_past_runs:
8184
archive_timestamp = int(time.time())
82-
if not os.path.exists("%s/../%s/" % (file_path, ARCHIVE_DIR)):
83-
os.makedirs("%s/../%s/" % (file_path, ARCHIVE_DIR))
85+
if not os.path.exists("%s/../%s/" % (file_path, self.ARCHIVE_DIR)):
86+
os.makedirs("%s/../%s/" % (file_path, self.ARCHIVE_DIR))
8487
archive_dir = "%s/../%s/log_%s" % (
85-
file_path, ARCHIVE_DIR, archive_timestamp)
88+
file_path, self.ARCHIVE_DIR, archive_timestamp)
8689
shutil.move(file_path, archive_dir)
8790
os.makedirs(file_path)
8891
if get_log_folder:
8992
return archive_dir
9093
else:
9194
# Just delete bad pages to make room for the latest run.
9295
filelist = [f for f in os.listdir(
93-
"./%s" % LATEST_REPORT_DIR) if f.startswith("failed_") or (
94-
f == RESULTS_PAGE) or (f.startswith("automation_failure")) or (
95-
f == BAD_PAGE_LOG)]
96+
"./%s" % self.LATEST_REPORT_DIR) if (
97+
f.startswith("failed_")) or (
98+
f == self.RESULTS_PAGE) or (
99+
f.startswith("automation_failure")) or (
100+
f == self.BAD_PAGE_LOG)]
96101
for f in filelist:
97102
os.remove("%s/%s" % (file_path, f))
98103

@@ -137,7 +142,7 @@ def __jq_confirm_dialog(self, question):
137142

138143
def __manual_page_check(self, *args):
139144
if not args:
140-
instructions = DEFAULT_VALIDATION_MESSAGE # self.verify()
145+
instructions = self.DEFAULT_VALIDATION_MESSAGE # self.verify()
141146
else:
142147
instructions = str(args[0])
143148
if len(args) > 1:
@@ -149,7 +154,7 @@ def __manual_page_check(self, *args):
149154
elif instructions and "?" in instructions:
150155
question = instructions
151156

152-
wait_time_before_verify = WAIT_TIME_BEFORE_VERIFY
157+
wait_time_before_verify = self.WAIT_TIME_BEFORE_VERIFY
153158
if self.verify_delay:
154159
wait_time_before_verify = float(self.verify_delay)
155160
# Allow a moment to see the full page before the dialog box pops up
@@ -237,7 +242,7 @@ def __manual_page_check(self, *args):
237242
return 1
238243
else:
239244
bad_page_name = "failed_check_%s.png" % self.manual_check_count
240-
self.save_screenshot(bad_page_name, folder=LATEST_REPORT_DIR)
245+
self.save_screenshot(bad_page_name, folder=self.LATEST_REPORT_DIR)
241246
self.page_results_list.append(
242247
'"%s","%s","%s","%s","%s","%s","%s","%s"' % (
243248
self.manual_check_count,
@@ -250,8 +255,8 @@ def __manual_page_check(self, *args):
250255
"*"))
251256
return 0
252257

253-
def __wait_for_special_alert_absent(
254-
self, timeout=MAX_IDLE_TIME_BEFORE_QUIT):
258+
def __wait_for_special_alert_absent(self):
259+
timeout = self.MAX_IDLE_TIME_BEFORE_QUIT
255260
for x in range(int(timeout * 20)):
256261
try:
257262
alert = self.driver.switch_to.alert
@@ -277,7 +282,7 @@ def __add_failure(self, exception=None):
277282

278283
self.incomplete_runs += 1
279284
error_page = "automation_failure_%s.png" % self.incomplete_runs
280-
self.save_screenshot(error_page, folder=LATEST_REPORT_DIR)
285+
self.save_screenshot(error_page, folder=self.LATEST_REPORT_DIR)
281286
self.page_results_list.append(
282287
'"%s","%s","%s","%s","%s","%s","%s","%s"' % (
283288
"ERR",
@@ -298,8 +303,8 @@ def __add_failure(self, exception=None):
298303

299304
def __add_bad_page_log_file(self):
300305
abs_path = os.path.abspath('.')
301-
file_path = abs_path + "/%s" % LATEST_REPORT_DIR
302-
log_file = "%s/%s" % (file_path, BAD_PAGE_LOG)
306+
file_path = abs_path + "/%s" % self.LATEST_REPORT_DIR
307+
log_file = "%s/%s" % (file_path, self.BAD_PAGE_LOG)
303308
f = open(log_file, 'w')
304309
h_p1 = '''"Num","Result","Screenshot","URL","Browser","Epoch Time",'''
305310
h_p2 = '''"Verification Instructions","Additional Info"\n'''
@@ -311,8 +316,8 @@ def __add_bad_page_log_file(self):
311316

312317
def __add_results_page(self, html):
313318
abs_path = os.path.abspath('.')
314-
file_path = abs_path + "/%s" % LATEST_REPORT_DIR
315-
results_file_name = RESULTS_PAGE
319+
file_path = abs_path + "/%s" % self.LATEST_REPORT_DIR
320+
results_file_name = self.RESULTS_PAGE
316321
results_file = "%s/%s" % (file_path, results_file_name)
317322
f = open(results_file, 'w')
318323
f.write(html)
@@ -345,7 +350,7 @@ def __process_manual_check_results(self, auto_close_results_page=False):
345350
log_string = self.__clear_out_old_logs(get_log_folder=True)
346351
log_folder = log_string.split('/')[-1]
347352
abs_path = os.path.abspath('.')
348-
file_path = abs_path + "/%s" % ARCHIVE_DIR
353+
file_path = abs_path + "/%s" % self.ARCHIVE_DIR
349354
log_path = "%s/%s" % (file_path, log_folder)
350355
web_log_path = "file://%s" % log_path
351356

@@ -376,9 +381,9 @@ def __process_manual_check_results(self, auto_close_results_page=False):
376381
%s</h1>''' % summary_table
377382

378383
log_link_shown = '../%s%s/' % (
379-
ARCHIVE_DIR, web_log_path.split(ARCHIVE_DIR)[1])
380-
csv_link = '%s/%s' % (web_log_path, BAD_PAGE_LOG)
381-
csv_link_shown = '%s' % BAD_PAGE_LOG
384+
self.ARCHIVE_DIR, web_log_path.split(self.ARCHIVE_DIR)[1])
385+
csv_link = '%s/%s' % (web_log_path, self.BAD_PAGE_LOG)
386+
csv_link_shown = '%s' % self.BAD_PAGE_LOG
382387
log_table = '''<p><p><p><p><h2><table><tbody>
383388
<tr><td>LOG FILES LINK:&nbsp;&nbsp;<td><a href="%s">%s</a></tr>
384389
<tr><td>RESULTS TABLE:&nbsp;&nbsp;<td><a href="%s">%s</a></tr>
@@ -411,7 +416,7 @@ def __process_manual_check_results(self, auto_close_results_page=False):
411416
report_html = '<html><head>%s</head><body>%s</body></html>' % (
412417
style, table_view)
413418
results_file = self.__add_results_page(report_html)
414-
archived_results_file = log_path + '/' + RESULTS_PAGE
419+
archived_results_file = log_path + '/' + self.RESULTS_PAGE
415420
shutil.copyfile(results_file, archived_results_file)
416421
print(
417422
"\n*** The results html page is located at: ***\n" + results_file)

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@
4545

4646
setup(
4747
name='seleniumbase',
48-
version='1.35.4',
48+
version='1.35.5',
4949
description='Fast, Easy, and Reliable Browser Automation & Testing.',
5050
long_description=long_description,
5151
long_description_content_type='text/markdown',

0 commit comments

Comments
 (0)