Skip to content

Commit eee9bca

Browse files
committed
Новая организация селениум тестов
1 parent c467d56 commit eee9bca

File tree

4 files changed

+159
-99
lines changed

4 files changed

+159
-99
lines changed

tests/selenium/selenium_session.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import requests
2+
from time import sleep
3+
4+
from selenium.webdriver import Chrome
5+
6+
class SeleniumSession:
7+
def __init__(self, host, config, chrome_options, requires_init=True):
8+
self.__prepare_session(host, config, chrome_options, requires_init)
9+
10+
def __init_driver(self, chrome_options):
11+
self.driver = Chrome(options=chrome_options)
12+
self.session = requests.Session()
13+
14+
sleep(5)
15+
16+
def __registrate(self, config):
17+
self.session.request('POST',f'{self.host}/lti', data={
18+
'lis_person_name_full': config.testing.lis_person_name_full,
19+
'ext_user_username': config.testing.session_id,
20+
'custom_task_id': config.testing.custom_task_id,
21+
'custom_task_description': config.testing.custom_task_description,
22+
'custom_attempt_count': config.testing.custom_attempt_count,
23+
'custom_required_points': config.testing.custom_required_points,
24+
'custom_criteria_pack_id': config.testing.custom_criteria_pack_id,
25+
'roles': config.testing.roles,
26+
'lis_outcome_service_url': config.testing.lis_outcome_service_url,
27+
'lis_result_sourcedid': config.testing.lis_result_source_did,
28+
'oauth_consumer_key': config.testing.oauth_consumer_key,
29+
})
30+
31+
def __prepare_session(self, host, config, chrome_options, requires_init):
32+
self.host = host
33+
34+
self.__init_driver(chrome_options)
35+
36+
if requires_init:
37+
self.driver.get(f'{self.host}/init/')
38+
39+
self.__registrate(config)
40+
41+
def end_session(self):
42+
self.driver.quit()
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
import os
2+
import pytest
3+
from time import sleep
4+
5+
from selenium.webdriver.chrome.options import Options
6+
7+
from training_session import Training
8+
9+
from app.config import Config
10+
11+
HOST = 'http://web:5000'
12+
ROOT_DIR = os.getcwd()
13+
14+
CONFIG_PATH = f'{ROOT_DIR}/app_conf/testing.ini'
15+
AUDIO_FILE = f"{ROOT_DIR}/simple_phrases_russian.wav"
16+
PRESENTATION_FILE = f"{ROOT_DIR}/test_data/test_presentation_file_0.pdf"
17+
18+
ESTIMATED_PROCESSING_TIME_IN_SECONDS = 100
19+
20+
def chrome_options():
21+
chrome_options = Options()
22+
23+
chrome_options.add_argument('--no-sandbox')
24+
chrome_options.add_argument('--headless')
25+
chrome_options.add_argument(f'--unsafely-treat-insecure-origin-as-secure={HOST}')
26+
27+
chrome_options.add_argument("--disable-user-media-security")
28+
chrome_options.add_argument("--use-fake-device-for-media-stream")
29+
chrome_options.add_argument("--use-fake-ui-for-media-stream")
30+
chrome_options.add_argument(f'--use-file-for-fake-audio-capture={AUDIO_FILE}')
31+
32+
return chrome_options
33+
34+
@pytest.fixture(scope='module')
35+
def training_session():
36+
Config.init_config(CONFIG_PATH)
37+
38+
training_session = Training(HOST, Config.c, chrome_options())
39+
40+
yield training_session
41+
42+
training_session.end_session()
43+
44+
def test_presentation_upload(training_session):
45+
training_session.upload_presentation(PRESENTATION_FILE)
46+
47+
def test_record_preparation(training_session):
48+
training_session.prepare_record()
49+
50+
sleep(5)
51+
52+
def test_button_next(training_session):
53+
training_session.next_slide()
54+
55+
sleep(5)
56+
57+
def test_training_session_end(training_session):
58+
training_session.end_training()
59+
60+
sleep(5)
61+
62+
def test_training_feedback(training_session):
63+
got_feegback = training_session.wait_for_feedback(ESTIMATED_PROCESSING_TIME_IN_SECONDS)
64+
assert got_feegback, f"Проверка тренировки заняла более {ESTIMATED_PROCESSING_TIME_IN_SECONDS} секунд"

tests/selenium/test_training.py

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

tests/selenium/training_session.py

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
from time import sleep
2+
3+
from selenium_session import SeleniumSession
4+
5+
from selenium.webdriver.common.by import By
6+
from selenium.webdriver.support import expected_conditions as EC
7+
from selenium.webdriver.support.ui import WebDriverWait
8+
9+
10+
class Training(SeleniumSession):
11+
def __init__(self, host, config, chrome_options, requires_init=True):
12+
super().__init__(host, config, chrome_options, requires_init)
13+
14+
def upload_presentation(self, presentation_path):
15+
self.driver.get(f'{self.host}/upload_presentation/')
16+
17+
file_input = WebDriverWait(self.driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "input[type=file]")))
18+
file_input.send_keys(presentation_path)
19+
20+
WebDriverWait(self.driver, 5).until(EC.element_to_be_clickable((By.ID, "button-submit"))).click()
21+
22+
def prepare_record(self):
23+
WebDriverWait(self.driver, 10).until(EC.element_to_be_clickable((By.ID, "record"))).click()
24+
25+
WebDriverWait(self.driver, 10).until(EC.presence_of_element_located((By.ID, "model-timer")))
26+
27+
WebDriverWait(self.driver, 10).until(EC.invisibility_of_element((By.ID, "model-timer")))
28+
29+
def next_slide(self):
30+
WebDriverWait(self.driver, 10).until(EC.element_to_be_clickable((By.ID, "next"))).click()
31+
32+
def end_training(self):
33+
WebDriverWait(self.driver, 5).until(EC.element_to_be_clickable((By.ID, "done"))).click()
34+
35+
WebDriverWait(self.driver, 5).until(lambda d : d.switch_to.alert).accept()
36+
37+
def wait_for_feedback(self, seconds):
38+
feedback_flag = False
39+
step_count = 10
40+
step = seconds / step_count
41+
42+
for _ in range(step_count):
43+
self.driver.refresh()
44+
45+
feedback_elements = self.driver.find_elements(By.ID, 'feedback')
46+
47+
if feedback_elements and feedback_elements[0].text.startswith('Оценка за тренировку'):
48+
feedback_flag = True
49+
break
50+
51+
sleep(step)
52+
53+
return feedback_flag

0 commit comments

Comments
 (0)