Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
122 changes: 79 additions & 43 deletions seleniumbase/core/capabilities_parser.py
Original file line number Diff line number Diff line change
@@ -1,18 +1,35 @@
import re
import ast
import json


def get_desired_capabilities(cap_file):
if not cap_file.endswith('.py'):
raise Exception("\n\n`%s` is not a Python file!\n\n" % cap_file)
def _analyze_ast(contents):
try:
return ast.literal_eval(contents)
except SyntaxError:
pass
try:
# remove all comments
contents = re.sub(re.compile(r"/\*.*?\*/", re.DOTALL), "", contents)
contents = re.sub(re.compile(r"#.*?\n"), "", contents)

# remove anything before dict declaration like: "caps = { ..."
match = re.match(r"^([^{]+)", contents)
if match:
contents = contents.replace(match.group(1), "")

# and try again
return ast.literal_eval(contents)
except SyntaxError:
pass

return False

f = open(cap_file, 'r')
all_code = f.read()
f.close()

desired_capabilities = {}
num_capabilities = 0
def _analyze_manual(contents):
capabilities = {}

code_lines = all_code.split('\n')
code_lines = contents.split('\n')
for line in code_lines:
if "desired_cap = {" in line:
line = line.split("desired_cap = {")[1]
Expand All @@ -22,17 +39,15 @@ def get_desired_capabilities(cap_file):
if data:
key = data.group(1)
value = data.group(2)
desired_capabilities[key] = value
num_capabilities += 1
capabilities[key] = value
continue

# "KEY" : "VALUE"
data = re.match(r'^\s*"([\S\s]+)"\s*:\s*"([\S\s]+)"\s*[,}]?\s*$', line)
if data:
key = data.group(1)
value = data.group(2)
desired_capabilities[key] = value
num_capabilities += 1
capabilities[key] = value
continue

# 'KEY' : "VALUE"
Expand All @@ -41,8 +56,7 @@ def get_desired_capabilities(cap_file):
if data:
key = data.group(1)
value = data.group(2)
desired_capabilities[key] = value
num_capabilities += 1
capabilities[key] = value
continue

# "KEY" : 'VALUE'
Expand All @@ -51,8 +65,7 @@ def get_desired_capabilities(cap_file):
if data:
key = data.group(1)
value = data.group(2)
desired_capabilities[key] = value
num_capabilities += 1
capabilities[key] = value
continue

# "KEY" : True
Expand All @@ -61,8 +74,7 @@ def get_desired_capabilities(cap_file):
if data:
key = data.group(1)
value = True
desired_capabilities[key] = value
num_capabilities += 1
capabilities[key] = value
continue

# 'KEY' : True
Expand All @@ -71,8 +83,7 @@ def get_desired_capabilities(cap_file):
if data:
key = data.group(1)
value = True
desired_capabilities[key] = value
num_capabilities += 1
capabilities[key] = value
continue

# "KEY" : False
Expand All @@ -81,8 +92,7 @@ def get_desired_capabilities(cap_file):
if data:
key = data.group(1)
value = False
desired_capabilities[key] = value
num_capabilities += 1
capabilities[key] = value
continue

# 'KEY' : False
Expand All @@ -91,26 +101,23 @@ def get_desired_capabilities(cap_file):
if data:
key = data.group(1)
value = False
desired_capabilities[key] = value
num_capabilities += 1
capabilities[key] = value
continue

# caps['KEY'] = 'VALUE'
data = re.match(r"^\s*caps\['([\S\s]+)'\]\s*=\s*'([\S\s]+)'\s*$", line)
if data:
key = data.group(1)
value = data.group(2)
desired_capabilities[key] = value
num_capabilities += 1
capabilities[key] = value
continue

# caps["KEY"] = "VALUE"
data = re.match(r'^\s*caps\["([\S\s]+)"\]\s*=\s*"([\S\s]+)"\s*$', line)
if data:
key = data.group(1)
value = data.group(2)
desired_capabilities[key] = value
num_capabilities += 1
capabilities[key] = value
continue

# caps['KEY'] = "VALUE"
Expand All @@ -119,8 +126,7 @@ def get_desired_capabilities(cap_file):
if data:
key = data.group(1)
value = data.group(2)
desired_capabilities[key] = value
num_capabilities += 1
capabilities[key] = value
continue

# caps["KEY"] = 'VALUE'
Expand All @@ -129,8 +135,7 @@ def get_desired_capabilities(cap_file):
if data:
key = data.group(1)
value = data.group(2)
desired_capabilities[key] = value
num_capabilities += 1
capabilities[key] = value
continue

# caps["KEY"] = True
Expand All @@ -139,8 +144,7 @@ def get_desired_capabilities(cap_file):
if data:
key = data.group(1)
value = True
desired_capabilities[key] = value
num_capabilities += 1
capabilities[key] = value
continue

# caps['KEY'] = True
Expand All @@ -149,8 +153,7 @@ def get_desired_capabilities(cap_file):
if data:
key = data.group(1)
value = True
desired_capabilities[key] = value
num_capabilities += 1
capabilities[key] = value
continue

# caps["KEY"] = False
Expand All @@ -159,8 +162,7 @@ def get_desired_capabilities(cap_file):
if data:
key = data.group(1)
value = False
desired_capabilities[key] = value
num_capabilities += 1
capabilities[key] = value
continue

# caps['KEY'] = False
Expand All @@ -169,11 +171,45 @@ def get_desired_capabilities(cap_file):
if data:
key = data.group(1)
value = False
desired_capabilities[key] = value
num_capabilities += 1
capabilities[key] = value
continue

if num_capabilities == 0:
return capabilities


def _read_file(file):
f = open(file, 'r')
data = f.read()
f.close()

return data


def _parse_py_file(cap_file):
all_code = _read_file(cap_file)
capabilities = _analyze_ast(all_code)

if not capabilities:
capabilities = _analyze_manual(all_code)

return capabilities


def _parse_json_file(cap_file):
all_code = _read_file(cap_file)

return json.loads(all_code)


def get_desired_capabilities(cap_file):
if cap_file.endswith('.py'):
capabilities = _parse_py_file(cap_file)
elif cap_file.endswith('.json'):
capabilities = _parse_json_file(cap_file)
else:
raise Exception("\n\n`%s` is not a Python or JSON file!\n" % cap_file)
Comment on lines +209 to +210
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This part should happen before f = open(cap_file, 'r') if the file type is invalid.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fixed


if len(capabilities.keys()) == 0:
raise Exception("Unable to parse desired capabilities file!")

return desired_capabilities
return capabilities