Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
S2-group
GitHub Repository: S2-group/android-runner
Path: blob/master/AndroidRunner/WebExperiment.py
629 views
1
import os.path as op
2
import time
3
import multiprocessing as mp
4
from . import Tests
5
import paths
6
from .BrowserFactory import BrowserFactory
7
from .Experiment import Experiment
8
from .util import makedirs, slugify_dir
9
from AndroidRunner.PrematureStoppableRun import PrematureStoppableRun
10
11
12
class WebExperiment(Experiment):
13
def __init__(self, config, progress, restart):
14
super(WebExperiment, self).__init__(config, progress, restart)
15
self.browsers = [BrowserFactory.get_browser(b)() for b in config.get('browsers', ['chrome'])]
16
Tests.check_dependencies(self.devices, [b.package_name for b in self.browsers])
17
self.duration = Tests.is_integer(config.get('duration', 0)) / 1000
18
self.config = config
19
20
# Browsers have version specific formatting, allows re-creation if needed
21
def regenerate_browsers(self, device):
22
# Regenerate browsers based on device version
23
self.browsers = [BrowserFactory.get_browser(b)(device) for b in self.config.get('browsers', ['chrome'])]
24
25
def run(self, device, path, run, browser_name):
26
browser = None
27
for browserItem in self.browsers:
28
if browser_name in browserItem.to_string():
29
browser = browserItem
30
kwargs = {
31
'browser': browser,
32
'app': browser.package_name
33
}
34
self.before_run(device, path, run, **kwargs)
35
self.after_launch(device, path, run, **kwargs)
36
37
self.usb_handler.disable_usb()
38
self.start_profiling(device, path, run, **kwargs)
39
40
if self.run_stopping_condition_config:
41
self.queue = mp.Queue()
42
premature_stoppable_run = PrematureStoppableRun(self.run_stopping_condition_config, self.queue, self.interaction, device, path, run, **kwargs)
43
premature_stoppable_run.run()
44
else:
45
self.interaction(device, path, run, **kwargs)
46
47
self.stop_profiling(device, path, run, **kwargs)
48
self.usb_handler.enable_usb()
49
50
self.before_close(device, path, run, **kwargs)
51
self.after_run(device, path, run, **kwargs)
52
53
def last_run_subject(self, current_run):
54
if self.progress.subject_finished(current_run['device'], current_run['path'], current_run['browser']):
55
self.after_last_run(self.devices.get_device(current_run['device']), current_run['path'])
56
self.aggregate_subject()
57
58
def prepare_output_dir(self, current_run):
59
paths.OUTPUT_DIR = op.join(paths.BASE_OUTPUT_DIR, 'data/', current_run['device'],
60
slugify_dir(current_run['path']),
61
current_run['browser'])
62
makedirs(paths.OUTPUT_DIR)
63
64
def before_run_subject(self, device, path, *args, **kwargs):
65
super(WebExperiment, self).before_run_subject(device, path, *args, **kwargs)
66
self.logger.info('URL: %s' % path)
67
68
def before_run(self, device, path, run, *args, **kwargs):
69
super(WebExperiment, self).before_run(device, path, run, *args, **kwargs)
70
device.shell('logcat -c')
71
kwargs['browser'].start(device)
72
time.sleep(5)
73
74
def before_experiment(self, device, *args, **kwargs):
75
super().before_experiment(self, device, *args, **kwargs)
76
self.regenerate_browsers(device)
77
78
def interaction(self, device, path, run, *args, **kwargs):
79
kwargs['browser'].load_url(device, path)
80
time.sleep(5)
81
super(WebExperiment, self).interaction(device, path, run, *args, **kwargs)
82
# TODO: Fix web experiments running longer than self.duration
83
time.sleep(self.duration)
84
85
def after_run(self, device, path, run, *args, **kwargs):
86
kwargs['browser'].stop(device, self.clear_cache)
87
time.sleep(3)
88
super(WebExperiment, self).after_run(device, path, run, *args, **kwargs)
89
90
def after_last_run(self, device, path, *args, **kwargs):
91
super(WebExperiment, self).after_last_run(device, path, *args, **kwargs)
92
93
def cleanup(self, device):
94
super(WebExperiment, self).cleanup(device)
95
for browser in self.browsers:
96
browser.stop(device, clear_data=True)
97
98