playtender.robot
42.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
*** Settings ***
Library String
Library DateTime
Library playtender_service.py
*** Variables ***
${planFormSubmitSuccessMessage} = План закупівлі створений, дочекайтесь опублікування на сайті уповноваженого органу.
${planEditButton} = div#plan-part-pjax.pjax-container.pjax-layout-container div.aside__inner span.btn-new__inner span.btn-new__text
*** Keywords ***
Підготувати дані для оголошення тендера
[Arguments] ${username} ${tender_data} ${param3}
[return] ${tender_data}
Підготувати клієнт для користувача
[Arguments] ${username}
[Documentation] Відкрити браузер, створити об’єкт api wrapper, тощо
Open Browser ${BROKERS['playtender'].homepage} ${USERS.users['${username}'].browser} alias=${username}
Set Window Size @{USERS.users['${username}'].size}
Set Window Position @{USERS.users['${username}'].position}
inject_urllib3
Login ${username}
Login
[Arguments] ${username}
Run Keyword And Ignore Error Click Element xpath=//button[@class='languages__btn js-popup-open-initiator']
Run Keyword And Ignore Error Wait Until Element Is Visible xpath=//*[contains(@data-language, '1')] 60
Run Keyword And Ignore Error Click Link xpath=//*[contains(@data-language, '1')]
#Go To ${USERS.users['${username}'].homepage}
Wait Until Element Is Visible xpath=//a[@data-action='login'] 60
Click Link xpath=//a[(@data-action='login') and contains(.,'Увійти')]
Wait Until Page Contains Element id=loginform-email 60
Input text id=loginform-email ${USERS.users['${username}'].login}
Input text id=loginform-password ${USERS.users['${username}'].password}
Click Button xpath=//button[(@class='btn btn-lg w-lg-x2 btn-success js-submit-btn') and contains(.,'Увійти')]
Wait Until Page Contains Активні 60
Set Global Variable ${playtender_LOGIN_USER} ${username}
Wait For Page Create Tender
[Arguments] ${url}
Go To ${url}
Sleep 10
Wait Until Page Contains Element xpath=//form[@id="tender-form"] 60
Створити тендер
[Arguments] ${user} ${tender_data}
${tender_data}= procuring_entity_name ${tender_data}
${tender_data_keys}= Get Dictionary Keys ${tender_data.data}
${procurementMethodType} = Set Variable If 'procurementMethodType' in ${tender_data_keys} ${tender_data.data.procurementMethodType} belowThreshold
Set To Dictionary ${USERS.users['${playtender_LOGIN_USER}']} tender_methodtype=${procurementMethodType}
# change organization info
#UserChangeOrgnizationInfo ${tender_data.data.procuringEntity}
# Run Keyword If '${SUITE_NAME}' == 'Tests Files.Complaints' Go To ${BROKERS['playtender'].basepage}/utils/config?tacceleration=${BROKERS['playtender'].intervals.belowThreshold.accelerator}
Run Keyword If '${SUITE_NAME}' == 'Tests Files.Complaints' and '${procurementMethodType}' == 'belowThreshold' Go To ${BROKERS['playtender'].basepage}/utils/config?tacceleration=360
Run Keyword If '${procurementMethodType}' == 'negotiation' Go To ${BROKERS['playtender'].basepage}/utils/config?tacceleration=1080
Run Keyword If '${procurementMethodType}' == 'aboveThresholdUA.defense' Go To ${BROKERS['playtender'].basepage}/utils/config?tacceleration=720
Selenium2Library.Switch Browser ${user}
Run Keyword If '${procurementMethodType}' == 'belowThreshold' and 'lots' not in ${tender_data_keys} Wait Until Keyword Succeeds 100 s 10 s Wait For Page Create Tender ${BROKERS['playtender'].basepage}/tender/create?type=${procurementMethodType}&multilot=0
Run Keyword If '${procurementMethodType}' != 'belowThreshold' or 'lots' in ${tender_data_keys} Wait Until Keyword Succeeds 100 s 10 s Wait For Page Create Tender ${BROKERS['playtender'].basepage}/tender/create?type=${procurementMethodType}
Wait Until Page Contains Element xpath=//form[@id="tender-form"] 60
### BOF - Reporting ###
Run Keyword And Return If '${procurementMethodType}' == 'reporting' Створити тендер без лотів ${user} ${tender_data}
Run Keyword And Return If '${procurementMethodType}' == 'belowThreshold' and 'lots' not in ${tender_data_keys} Створити тендер без лотів ${user} ${tender_data}
### EOF - Reporting ###
${title}= Get From Dictionary ${tender_data.data} title
${description}= Get From Dictionary ${tender_data.data} description
${playtender_proc_type}= Convert_to_Lowercase ${procurementMethodType}
${playtender_proc_type}= Remove String ${playtender_proc_type} \.
Run Keyword If '${mode}' in 'belowThreshold below_funders' and ${number_of_lots} != 0 Click Element xpath=//input[@id='tenderbelowthresholdform-is_multilot']
Input text id=tender${playtender_proc_type}form-title ${title}
Run Keyword If 'cause' in ${tender_data_keys} Select From List By Value id=tender${playtender_proc_type}form-cause ${tender_data.data.cause}
Run Keyword If 'causeDescription' in ${tender_data_keys} Input text id=tender${playtender_proc_type}form-cause_description ${tender_data.data.causeDescription}
Run Keyword If 'title_en' in ${tender_data_keys} Input Text With Checking Input Isset \#tender${playtender_proc_type}form-title_en ${tender_data.data.title_en}
Input text id=tender${playtender_proc_type}form-description ${description}
Run Keyword If 'description_en' in ${tender_data_keys} Input Text With Checking Input Isset \#tender${playtender_proc_type}form-description_en ${tender_data.data.description_en}
Run Keyword If 'fundingKind' in ${tender_data_keys} Select From List By Value id=tender${playtender_proc_type}form-funding_kind ${tender_data.data.fundingKind}
Run Keyword If 'NBUdiscountRate' in ${tender_data_keys} Input Float Multiply100 \#tender${playtender_proc_type}form-nbu_discount_rate ${tender_data.data.NBUdiscountRate}
Click Element id=tender${playtender_proc_type}form-value_added_tax_included
Run Keyword If 'mainProcurementCategory' in ${tender_data_keys} Select From List By Value id=tender${playtender_proc_type}form-main_procurement_category ${tender_data.data.mainProcurementCategory}
Run Keyword If '${procurementMethodType}' == 'belowThreshold' Створити тендер enquiryPeriod.startDate ${playtender_proc_type} ${tender_data.data.enquiryPeriod.startDate}
Run Keyword If '${procurementMethodType}' == 'belowThreshold' Створити тендер enquiryPeriod.endDate ${playtender_proc_type} ${tender_data.data.enquiryPeriod.endDate}
Run Keyword If '${procurementMethodType}' == 'belowThreshold' Створити тендер tenderPeriod.startDate ${playtender_proc_type} ${tender_data.data.tenderPeriod.startDate}
Run Keyword If '${procurementMethodType}' != 'negotiation' Створити тендер tenderPeriod.end_date ${playtender_proc_type} ${tender_data.data.tenderPeriod.endDate}
Select Checkbox id=tender${playtender_proc_type}form-quick_mode
Run Keyword If '${SUITE_NAME}' == 'Tests Files.Complaints' Select Checkbox id=tender${playtender_proc_type}form-auction_skip_mode
### BOF - BelowFunders ###
Run Keyword If 'funders' in ${tender_data_keys} Створити тендер Funder ${tender_data.data.funders[0]}
### EOF - BelowFunders ###
Click Element xpath=//*[contains(@href, '#collapseLots')]
Sleep 1
JsSetScrollToElementBySelector \#collapseLots
Click Element xpath=//span[@data-confirm-text='Ви впевнені що бажаєте видалити поточний лот?']
Click Element xpath=//div[contains(@class, 'jconfirm-box')]//button[contains(text(), 'Так')]
${items}= Get From Dictionary ${tender_data.data} items
${lots}= Get From Dictionary ${tender_data.data} lots
Set To Dictionary ${USERS.users['${playtender_LOGIN_USER}']} lots=${lots}
${lots_length}= Get Length ${lots}
: FOR ${INDEX} IN RANGE 0 ${lots_length}
\ Sleep 2
#cat \ Click Element xpath=//a[@href='#add-lots']
\ Execute Javascript $( 'a[href="#add-lots"]' ).trigger( 'click' )
\ Sleep 2
\ Wait Until Page Contains Товар/послуга № 60
\ Click Element jquery=div[data-type="lot"].active span[data-confirm-text="Ви впевнені що бажаєте видалити поточний товар/послугу?"]
\ Click Element xpath=//div[contains(@class, 'jconfirm-box')]//button[contains(text(), 'Так')]
\ Sleep 1
\ Run Keyword If 'features' in ${tender_data_keys} Додати лот ${lots[${INDEX}]} ${INDEX} ${procurementMethodType} ${items} ${tender_data.data.features}
\ Run Keyword If 'features' not in ${tender_data_keys} Додати лот Ex2 ${lots[${INDEX}]} ${INDEX} ${procurementMethodType} ${items}
Run Keyword If 'features' in ${tender_data_keys} Click Element xpath=//*[contains(@href, '#collapseFeatures')]
Sleep 1
Run Keyword If 'features' in ${tender_data_keys} Add Features Ex ${tender_data.data.features} tenderer ${procurementMethodType} div[@id='collapseFeatures']
${Ids}= Створити тендер Збереження форми
[return] ${Ids}
Створити тендер без лотів
[Arguments] ${user} ${tender_data}
${tender_data_keys}= Get Dictionary Keys ${tender_data.data}
${procurementMethodType}= Get From Dictionary ${USERS.users['${playtender_LOGIN_USER}']} tender_methodtype
${budget}= convert_float_to_string ${tender_data.data.value.amount}
${playtender_proc_type}= Convert_to_Lowercase ${procurementMethodType}
${playtender_proc_type}= Remove String ${playtender_proc_type} \.
# fill general data
Дочекатися І Клікнути xpath=//a[contains(@data-url,'#general-form-popup')]
Input text id=tender${playtender_proc_type}form-title ${tender_data.data.title}
Input text id=tender${playtender_proc_type}form-description ${tender_data.data.description}
JsSetScrollToElementBySelector \#tender${playtender_proc_type}form-value_amount
Input text id=tender${playtender_proc_type}form-value_amount ${budget}
Select From List By Value id=tender${playtender_proc_type}form-value_currency ${tender_data.data.value.currency}
Run Keyword If ${tender_data.data.value.valueAddedTaxIncluded} Click Element id=tender${playtender_proc_type}form-value_added_tax_included
Run Keyword If '${procurementMethodType}' == 'belowThreshold' Input Float \#tender${playtender_proc_type}form-min_step_amount ${tender_data.data.minimalStep.amount}
Run Keyword If '${procurementMethodType}' == 'belowThreshold' Створити тендер enquiryPeriod.startDate ${playtender_proc_type} ${tender_data.data.enquiryPeriod.startDate}
Run Keyword If '${procurementMethodType}' == 'belowThreshold' Створити тендер enquiryPeriod.endDate ${playtender_proc_type} ${tender_data.data.enquiryPeriod.endDate}
Run Keyword If '${procurementMethodType}' == 'belowThreshold' Створити тендер tenderPeriod.startDate ${playtender_proc_type} ${tender_data.data.tenderPeriod.startDate}
Run Keyword If '${procurementMethodType}' == 'belowThreshold' Створити тендер tenderPeriod.end_date ${playtender_proc_type} ${tender_data.data.tenderPeriod.endDate}
Run Keyword If '${procurementMethodType}' == 'belowThreshold' Select Checkbox id=tender${playtender_proc_type}form-quick_mode
Scroll To Element xpath=//div[contains(@id,"general-form-popup")]//a[contains(@class,'btn btn-success js-popup-submit')]
Дочекатися і Клікнути xpath=//div[contains(@id,"general-form-popup")]//a[contains(@class,'btn btn-success js-popup-submit')]
# fill items
# Click Element xpath=//*[contains(@href, '#collapseItems')]
# Sleep 1
# JsSetScrollToElementBySelector \#collapseItems
Scroll To Element xpath=//form[@id="tender-form"]//a[contains(@class,'btn btn-default btn-update js-form-popup-add')]
Wait Until Element Is Visible xpath=//form[@id="tender-form"]//a[contains(@class,'btn btn-default btn-update js-form-popup-add')] 6
Sleep 3
Дочекатися і Клікнути xpath=//form[@id="tender-form"]//a[contains(@class,"btn btn-default btn-update js-form-popup-add")]
Wait Until Page Contains Element xpath=//div[contains(@class,"modal modal-form js-form-popup fancybox-content")] 60
# Wait Until Page Contains Товар/послуга № 60
# Wait Until Page Contains Товар/послуга № 60
# Click Element xpath=//span[@data-confirm-text='Ви впевнені що бажаєте видалити поточний товар/послугу?']
# Click Element xpath=//div[contains(@class, 'jconfirm-box')]//button[contains(text(), 'Так')]
${items}= Get From Dictionary ${tender_data.data} items
${items_length}= Get Length ${items}
: FOR ${INDEX} IN RANGE 0 ${items_length}
# \ JsSetScrollToElementBySelector \#collapseItems a[href='#add-items']
# \ Click Element jquery=#collapseItems a[href="#add-items"]
# \ Sleep 2
# \ Додати предмет By Wrapper \#collapseItems div[data-type='item'].active ${items[${INDEX}]} ${procurementMethodType}
# \ Додати предмет By Wrapper //*[@class="modal modal-form js-form-popup fancybox-content"] ${items[${INDEX}]} ${procurementMethodType}
\ Додати предмет By Wrapper \.modal.modal-form.js-form-popup.fancybox-content ${items[${INDEX}]} ${procurementMethodType}
Run Keyword If '${procurementMethodType}' == 'reporting' Додати постачальника For Reporting Fake
${Ids}= Створити тендер Збереження форми
[return] ${Ids}
#Wait For UAID
# Sleep 5
# Reload Page
# ${tender_UAid}= Get Text xpath=//*[contains(@class, 'tender-id')]//*[@class='value']
#Клацнути і дочекатися
# [Arguments] ${click_locator} ${wanted_locator} ${timeout}
# [Documentation]
# ... click_locator: Where to click
# ... wanted_locator: What are we waiting for
# ... timeout: Timeout
# Click Element ${click_locator}
# Sleep 3
# Wait Until Page Contains Element ${wanted_locator} ${timeout}
Клацнути і дочекатися пошук
[Arguments] ${click_locator} ${wanted_locator} ${timeout}
[Documentation]
... click_locator: Where to click
... wanted_locator: What are we waiting for
... timeout: Timeout
Press key ${click_locator} \\13
Sleep 3
Wait Until Page Contains Element ${wanted_locator} ${timeout}
Wait For Sync Tender
[Arguments] ${timeout}
${passed}= Run Keyword And Return Status Wait Until Keyword Succeeds ${timeout} s 0 s Wait For Sync Tender Finish
Run Keyword Unless ${passed} Fatal Error Sync Finish not finish in ${timeout} sec
Wait For Sync Tender Finish
Sleep 3
Reload Page
Page Should Not Contain Element id=tender-sync-info
### BOF - PLANNING ###
Створити план
[Arguments] ${user} ${plan_data}
${plan_data}= procuring_entity_name ${plan_data}
${data}= Get From Dictionary ${plan_data} data
${data_keys}= Get Dictionary Keys ${data}
${start_date}= convert_isodate_to_site_date_plan ${data.tender.tenderPeriod.startDate}
${budget_keys}= Get Dictionary Keys ${data.budget}
### ${classificationWrapper}= Set Variable \//div[@id="general-form-popup"]
${classificationWrapper}= Set Variable \div[id$="general-form-popup"]
## preparing
# UserChangeOrgnizationInfo ${data.procuringEntity}
## load form page
Go To ${BROKERS['playtender'].basepage}/plan/create
Wait Until Page Contains Element xpath=//form[@id="plan-form"] 60
## filling form
Дочекатися І Клікнути xpath=//a[contains(@data-url,'#general-form-popup')]
Select From List By Value id=planform-procurement_method_type ${data.tender.procurementMethodType}
Run Keyword If 'period' in ${budget_keys} input datetime \#planform-period_start_date ${data.budget.period.startDate}
Run Keyword If 'period' in ${budget_keys} input datetime \#planform-period_end_date ${data.budget.period.endDate}
JsInputHiddenText \#planform-budget_id ${data.budget.id}
Input text id=planform-title ${data.budget.description}
Input Float \#planform-value_amount ${data.budget.amount}
Select From List By Value id=planform-value_currency ${data.budget.currency}
JsInputHiddenText \#planform-project_id ${data.budget.project.id}
JsInputHiddenText \#planform-project_name ${data.budget.project.name}
Input text id=planform-tender_start_date ${start_date}
InputClassificationByWrapper ${classificationWrapper} ${data.classification.id}
Run Keyword If 'additionalClassifications' in ${data_keys} InputAdditionalClassificationsByWrapper ${classificationWrapper} ${data.additionalClassifications}
Scroll To Element xpath=//div[contains(@id,"general-form-popup")]//a[contains(@class,"btn btn-success js-popup-submit")]
Дочекатися і Клікнути xpath=//div[contains(@id,"general-form-popup")]//a[contains(@class,"btn btn-success js-popup-submit")]
Run Keyword If 'items' in ${data_keys} InputPlanItems ${data}
## submit form
Дочекатися і Клікнути xpath=//*[@id='submitBtn']
Wait Until Page Contains ${planFormSubmitSuccessMessage} 60
CheckAlertMessageAndCloseIt
Wait For Sync Tender 360
${plan_id} Get Text jquery=#plan-general-info .plan-id .value
[Return] ${plan_id}
Пошук плану по ідентифікатору
[Arguments] ${username} ${tenderId}
Run Keyword If '${ROLE}' == 'viewer' Go To ${BROKERS['playtender'].basepage}/utils/plan-sync?planid=${tenderId}
Run Keyword If '${ROLE}' == 'viewer' Sleep 5
${planNotSynced}= Run Keyword And Return Status Page Should Contain fail
Run Keyword If '${ROLE}' == 'viewer' and ${planNotSynced} Go To ${BROKERS['playtender'].basepage}/utils/queue-plan-update
Run Keyword If '${ROLE}' == 'viewer' and ${planNotSynced} Sleep 30
Go To ${BROKERS['playtender'].basepage}/plans
Wait Until Page Contains Element id=plansearchform-query 60
#cat Input Text id=plansearchform-query ${tenderId}
#cat Click Element jquery=#plan-search-form .js-submit-btn
Input Text xpath=//input[@data-ds='query-input'] ${tenderId}
Click Element xpath=//button[@class='btn btn-default js-submit-btn']
#cat Press key xpath=//input[@data-ds='query-input'] \\13
Sleep 1
${passed}= Run Keyword And Return Status Wait Until Keyword Succeeds 360 s 0 s Шукати і знайти план
Run Keyword Unless ${passed} Fatal Error Тендер не знайдено за 360 секунд
Wait Until Page Does Not Contain Element jquery=#plan-list-pjax.loading-wrapper
Capture Page Screenshot
Click Element xpath=(//div[@id='plan-list-pjax'])//a[contains(@href, '/plan/')][1]
Sleep 5
Шукати і знайти план
Клацнути і дочекатися пошук xpath=//button[@class='btn btn-default js-submit-btn'] xpath=(//div[@id='plan-list-pjax'])//a[contains(@href, '/plan/')][1] 5
Оновити сторінку з планом
[Arguments] ${username} ${tenderId}
Reload Page
Sleep 2s
Внести зміни в план
[Arguments] @{ARGUMENTS}
[Documentation]
... ${ARGUMENTS[0]} = username
... ${ARGUMENTS[1]} = ${TENDER_UAID}
... ${ARGUMENTS[2]} = key
... ${ARGUMENTS[3]} = value
PlanFormOpenByUAID ${ARGUMENTS[1]}
Run Keyword If '${ARGUMENTS[2]}' == 'budget.amount' Input text id=planform-value_amount ${ARGUMENTS[3]}
Run Keyword If '${ARGUMENTS[2]}' == 'budget.description' Input text id=planform-title ${ARGUMENTS[3]}
Run Keyword If '${ARGUMENTS[2]}' == 'items[0].deliveryDate.endDateitem'
# ... PlanUpdateItemDeliveryEndDate \#collapseItems .tab-content .tab-pane:first ${ARGUMENTS[3]}
... PlanUpdateItemDeliveryEndDateNew \#collapseItems .tab-content .tab-pane:first ${ARGUMENTS[3]}
Run Keyword If '${ARGUMENTS[2]}' == 'items[0].quantity' JsTabShowAndScroll ul.form-nav-tabs a[data-toggle='tab'][href='#collapseItems']
Run Keyword If '${ARGUMENTS[2]}' == 'items[0].quantity' JsTabShowAndScroll \#collapseItems .nav li:first a
Run Keyword If '${ARGUMENTS[2]}' == 'items[0].quantity'
... PlanUpdateItemQuantity \#collapseItems .tab-content .tab-pane:first ${ARGUMENTS[3]}
PlanUpdateSave
Додати предмет закупівлі в план
[Arguments] ${username} ${uaid} ${item_data}
PlanFormOpenByUAID ${uaid}
InputPlanOneItem ${item_data}
PlanUpdateSave
Видалити предмет закупівлі плану
[Arguments] ${username} ${uaid} ${item_key}
PlanFormOpenByUAID ${uaid}
JsTabShowAndScroll ul.form-nav-tabs a[data-toggle='tab'][href='#collapseItems']
Click Element jquery=#collapseItems .nav li[data-title^='${item_key}']
Sleep 1
Click Element jquery=#collapseItems .nav li[data-title^='${item_key}'] .js-dynamic-form-remove
Wait Until Page Contains Ви впевнені що бажаєте видали обрану номенклатуру? 60
Click Element xpath=//div[contains(@class, 'jconfirm-box')]//button[contains(@class, 'btn btn-default waves-effect waves-light btn-lg')]
PlanUpdateSave
Отримати інформацію із плану
[Arguments] ${username} ${uaid} ${key}
${item0Wrapper}= Set Variable \#accordionItems .panel:nth(0) .panel-collapse:first
${item1Wrapper}= Set Variable \#accordionItems .panel:nth(1) .panel-collapse:first
${budget}= get_invisible_text jquery=#general-info .budget-amount
PlanOpenByUAID ${uaid}
JsSetScrollToElementBySelector \#general-info
Run Keyword And Return If '${key}' == 'tender.procurementMethodType' get_invisible_text jquery=#general-info .procurement-method-type
Run Keyword And Return If '${key}' == 'budget.amount' Convert To Number ${budget}
Run Keyword And Return If '${key}' == 'budget.description' get_text jquery=#general-info .budget-description .value
Run Keyword And Return If '${key}' == 'budget.currency' get_invisible_text jquery=#general-info .budget-currency
Run Keyword And Return If '${key}' == 'budget.id' get_text jquery=#general-info .budget-id .value
Run Keyword And Return If '${key}' == 'budget.project.id' get_invisible_text jquery=#general-info .budget-project-id
Run Keyword And Return If '${key}' == 'budget.project.name' get_invisible_text jquery=#general-info .budget-project-name
Run Keyword And Return If '${key}' == 'classification.description' get_invisible_text jquery=#general-info .main-classification-description
Run Keyword And Return If '${key}' == 'classification.scheme' get_invisible_text jquery=#general-info .main-classification-scheme
Run Keyword And Return If '${key}' == 'classification.id' get_invisible_text jquery=#general-info .main-classification-code
Run Keyword And Return If '${key}' == 'tender.tenderPeriod.startDate' get_invisible_text jquery=#general-info .tender-start-date-source
${procuringEntityNeedToBeVisible}= Run Keyword And Return Status Should Start With ${key} procuringEntity
Run Keyword If ${procuringEntityNeedToBeVisible} JsSetScrollToElementBySelector \#procuring-entity-info
Run Keyword And Return If '${key}' == 'procuringEntity.name' get_invisible_text jquery=#procuring-entity-info .name
Run Keyword And Return If '${key}' == 'procuringEntity.identifier.scheme' get_invisible_text jquery=#procuring-entity-info .identifier-scheme
Run Keyword And Return If '${key}' == 'procuringEntity.identifier.id' get_invisible_text jquery=#procuring-entity-info .identifier-code
Run Keyword And Return If '${key}' == 'procuringEntity.identifier.legalName' get_text jquery=#procuring-entity-info .legal-name .value
${item0NeedToBeVisible}= Run Keyword And Return Status Should Start With ${key} items[0]
Run Keyword If ${item0NeedToBeVisible} JsCollapseShowAndScroll ${item0Wrapper}
Run Keyword And Return If '${key}' == 'items[0].description' get_text jquery=div#accordionItems.panel-group div.panel.panel-default .panel-collapse.collapse.in div.panel-body div#w1.item-info-wrapper.info-wrapper p.title span.value
Run Keyword And Return If '${key}' == 'items[0].quantity' Get invisible text number by locator jquery=${item0Wrapper} .item-info-wrapper .quantity-source
Run Keyword And Return If '${key}' == 'items[0].deliveryDate.endDate' get_invisible_text jquery=${item0Wrapper} .item-info-wrapper .delivery-end-date-source
Run Keyword And Return If '${key}' == 'items[0].unit.code' get_invisible_text jquery=${item0Wrapper} .item-info-wrapper .unit-code-source
Run Keyword And Return If '${key}' == 'items[0].unit.name' get_invisible_text jquery=${item0Wrapper} .item-info-wrapper .unit-title-source
Run Keyword And Return If '${key}' == 'items[0].classification.description' get_invisible_text jquery=${item0Wrapper} .item-info-wrapper .main-classification-description
Run Keyword And Return If '${key}' == 'items[0].classification.scheme' get_invisible_text jquery=${item0Wrapper} .item-info-wrapper .main-classification-scheme
Run Keyword And Return If '${key}' == 'items[0].classification.id' get_invisible_text jquery=${item0Wrapper} .item-info-wrapper .main-classification-code
${item1NeedToBeVisible}= Run Keyword And Return Status Should Start With ${key} items[1]
Run Keyword If ${item1NeedToBeVisible} JsCollapseShowAndScroll ${item1Wrapper}
Run Keyword And Return If '${key}' == 'items[1].description' get_text jquery=${item1Wrapper} .item-info-wrapper .title .value
Run Keyword And Return If '${key}' == 'items[1].quantity' Get invisible text number by locator jquery=${item1Wrapper} .item-info-wrapper .quantity-source
Run Keyword And Return If '${key}' == 'items[1].deliveryDate.endDate' get_invisible_text jquery=${item1Wrapper} .item-info-wrapper .delivery-end-date-source
Run Keyword And Return If '${key}' == 'items[1].unit.code' get_invisible_text jquery=${item1Wrapper} .item-info-wrapper .unit-code-source
Run Keyword And Return If '${key}' == 'items[1].unit.name' get_invisible_text jquery=${item1Wrapper} .item-info-wrapper .unit-title-source
Run Keyword And Return If '${key}' == 'items[1].classification.description' get_invisible_text jquery=${item1Wrapper} .item-info-wrapper .main-classification-description
Run Keyword And Return If '${key}' == 'items[1].classification.scheme' get_invisible_text jquery=${item1Wrapper} .item-info-wrapper .main-classification-scheme
Run Keyword And Return If '${key}' == 'items[1].classification.id' get_invisible_text jquery=${item1Wrapper} .item-info-wrapper .main-classification-code
Fail NotImplemented
### EOF - PLANNING ###
### BOF - HELPERS ###
UserChangeOrgnizationInfo
[Arguments] ${data}
${keys}= Get Dictionary Keys ${data}
Go To ${BROKERS['playtender'].basepage}/user/profile
Wait Until Page Contains Інформація про компанію 60
Sleep 1
Run Keyword If 'name' in ${keys} Input text id=profileform-organization_name ${data.name}
Run Keyword If 'identifier' in ${keys} Input text id=profileform-organization_edrpou ${data.identifier.id}
Run Keyword If 'address' in ${keys} JsSetScrollToElementBySelector \#profileform-organization_region_id
Run Keyword If 'address' in ${keys} Select From List By Label jquery=#profileform-organization_region_id ${data.address.region}
Run Keyword If 'address' in ${keys} Input Text jquery=#profileform-organization_postal_code ${data.address.postalCode}
Run Keyword If 'address' in ${keys} Input Text jquery=#profileform-organization_locality ${data.address.locality}
Run Keyword If 'address' in ${keys} Input Text jquery=#profileform-organization_street_address ${data.address.streetAddress}
JsSetScrollToElementBySelector \#user-profile-form .js-submit-btn
Click Element jquery=\#user-profile-form .js-submit-btn
Sleep 1
Wait Until Page Contains Контактна інформація успішно оновлена 60
Click Element xpath=//div[contains(@class, 'jconfirm-box')]//button[contains(@class, 'btn btn-default waves-effect waves-light btn-lg')]
InputClassificationByWrapper
[Arguments] ${wrapper} ${classification_id}
# Click Element jquery=${wrapper} a[href='#classification']
### Дочекатися І Клікнути xpath=//a[contains(@data-target,'#planform-classification_id')]
### Дочекатися І Клікнути xpath=${wrapper}//a[contains(@data-target,'-classification_id')]
Дочекатися І Клікнути jquery=${wrapper} a[data-target$="-classification_id"]
#cat Wait Until Element Is Visible xpath=//div[contains(@id, 'classification-modal')]//h4[contains(@id, 'classificationModalLabel')]
Wait Until Page Contains Element xpath=//div[contains(@id, 'classification-modal')]//h4[contains(@id, 'classificationModalLabel')]
#cat Sleep 1
Input text jquery=#classification-modal .js-search-wrapper .js-input ${classification_id}
# Input text xpath=//div[contains(@id, 'classification-modal')]//input[@class='form-control js-input'] ${classification_id}
#cat Input text xpath=//div[contains(@id, 'classification-modal')]//input[@class='form-control js-input'] 99999999-9
# Press key xpath=//div[contains(@id, 'classification-modal')]//input[@class='form-control js-input'] \\13
# Sleep 1
Wait Until Page Contains Element xpath=//div[contains(@id, 'classification-modal')]//strong[contains(., '${classification_id}')] 60
Click Element xpath=//div[contains(@id, 'classification-modal')]//strong[contains(., '${classification_id}')]
#cat Click Element xpath=//div[contains(@id, 'classification-modal')]//i[@class='jstree-icon jstree-checkbox']
Click Element jquery=#classification-modal div.modal-footer div.buttons-wrapper button.btn.btn-default.waves-effect.waves-light.js-submit
# Click Element xpath=//div[contains(@id, 'classification-modal')]//button[contains(@class, 'btn btn-default waves-effect waves-light js-submit')]
# Sleep 1
InputAdditionalClassificationsByWrapper
[Arguments] ${wrapper} ${additionalClassifications}
## Wait Until Element Is Visible xpath=${wrapper}//a[contains(@data-target,"additional_classification_ids")] 2
# Wait Until Element Is Visible jquery=${wrapper} a[href='#additionalclassification'] 2
## Дочекатися І Клікнути xpath=${wrapper}//a[contains(@data-target,"additional_classification_ids")]
Дочекатися І Клікнути jquery=${wrapper} a[data-target$="additional_classification_ids"]
Wait Until Element Is Visible jquery=${wrapper} a[data-target$="additional_classification_ids"] 2
# Wait Until Element Is Visible xpath=//div[contains(@id, 'additional-classification-modal')]//h4[contains(@id, 'additionalClassificationModalLabel')]
Wait Until Element Is Visible jquery=#additional-classification-modal #addclstab0 .js-search-wrapper .js-input
Sleep 1
${count}= Get Length ${additionalClassifications}
: FOR ${INDEX} IN RANGE 0 ${count}
\ Continue For Loop If '${additionalClassifications[${INDEX}].scheme}' == 'ДКПП' or '${additionalClassifications[${INDEX}].scheme}' == 'UA-ROAD' or '${additionalClassifications[${INDEX}].scheme}' == 'GMDN'
\ Click Element jquery=#additional-classification-modal .nav a[data-toggle="tab"][data-scheme="${additionalClassifications[${INDEX}].scheme}"]
\ Wait Until Element Is Visible jquery=#additional-classification-modal .tab-pane.tree-wrapper.active input.js-input
\ Input text jquery=#additional-classification-modal .tab-pane.tree-wrapper.active input.js-input ${additionalClassifications[${INDEX}].id}
\ Press key jquery=#additional-classification-modal .tab-pane.tree-wrapper.active input.js-input \\13
\ Sleep 2
\ Wait Until Page Contains Element jquery=#additional-classification-modal .tab-pane.tree-wrapper.active .tree.js-search-tree strong:contains("${additionalClassifications[${INDEX}].id}") 60
\ Click Element jquery=#additional-classification-modal .tab-pane.tree-wrapper.active .tree.js-search-tree li:first i.jstree-checkbox
Click Element xpath=//div[contains(@id, 'additional-classification-modal')]//button[contains(@class, 'js-submit')]
# Sleep 1
InputPlanItems
[Arguments] ${data}
${items}= Get From Dictionary ${data} items
${count}= Get Length ${items}
: FOR ${INDEX} IN RANGE 0 ${count}
\ InputPlanOneItem ${items[${INDEX}]}
InputPlanOneItem
[Arguments] ${data}
# ${wrapper}= Set Variable \#collapseItems .tab-content .tab-pane.active
${wrapper}= Set Variable \div.modal-form.js-form-popup.fancybox-content
### div.modal-content div.form-group.form-simple-group
${wrapper_classification}= Set Variable \div.modal modal-form js-form-popup fancybox-content
## div.modal.modal-form.js-form-popup.fancybox-content
${wrapper_classification_x}= Set Variable \//div[@class="modal modal-form js-form-popup fancybox-content"]
${keys}= Get Dictionary Keys ${data}
JsTabShowAndScroll ul.form-nav-tabs a[data-toggle='tab'][href='#collapseItems']
# Click Element jquery=#collapseItems a[href="#add-items"]
Scroll To Element xpath=//*[@id="plan-form"]//a[@class='btn btn-default btn-update js-form-popup-add']
Дочекатися і Клікнути xpath=//*[@id="plan-form"]//a[@class='btn btn-default btn-update js-form-popup-add']
Sleep 2
Wait Until Element Is Visible jquery=${wrapper} [id$='-description'] 3
Input text jquery=${wrapper} [id$='-description'] ${data.description}
## Wait Until Element Is Visible xpath=//input[contains(@class,'form-control js-title')] 3
## Input text xpath=//input[contains(@class,'form-control js-title')] ${data.description}
PlanUpdateItemQuantity ${wrapper} ${data.quantity}
### PlanUpdateItemQuantity ${wrapper} 40
JsSetScrollToElementBySelector ${wrapper} [id$='-unit_id']
### Click Element xpath=//span[@class='select2-selection__rendered'][contains(@id,'id-container')][contains(.,'Одиниці виміру')]
# Click Element jquery=${wrapper} [id$='-unit_id']
# Wait Until Element Is Visible jquery=${wrapper} [id$='-unit_id'] 3
Wait Until Page Contains Element jquery=${wrapper} [id$='-unit_id'] 3
### Execute Javascript $('${wrapper} select2-selection select2-selection--single').trigger("click")
Click Element jquery=${wrapper} span.select2-selection__rendered
Input text xpath=//span[contains(@class,'select2-search select2-search--dropdown')]//input[contains(@class,'select2-search__field')] ${data.unit.name}
Press key xpath=//span[contains(@class,'select2-search select2-search--dropdown')]//input[contains(@class,'select2-search__field')] \\13
# Select From List By Label jquery=${wrapper} [id$='-unit_id'] ${data.unit.name}
InputClassificationByWrapper ${wrapper} ${data.classification.id}
### InputClassificationByWrapper ${wrapper_classification} ${data.classification.id}
Run Keyword If 'additionalClassifications' in ${keys}
... InputAdditionalClassificationsByWrapper ${wrapper} ${data.additionalClassifications}
# PlanUpdateItemDeliveryEndDate ${wrapper} ${data.deliveryDate.endDate}
PlanUpdateItemDeliveryEndDateNew ${wrapper} ${data.deliveryDate.endDate}
Дочекатися і Клікнути jquery=${wrapper} a.btn.btn-success.js-popup-submit
TenderOpenByUAID
[Arguments] ${uaid}
Go To ${BROKERS['playtender'].basepage}/tender/${uaid}
Wait Until Page Contains Закупівля ${uaid} 60
TenderFormOpenByUAID
[Arguments] ${uaid}
TenderOpenByUAID ${uaid}
Click Element xpath=//a[contains(@href, '/tender/update')][1]
Sleep 1
Wait Until Page Contains Element id=tender-form 60
Sleep 1
PlanOpenByUAID
[Arguments] ${uaid}
Go To ${BROKERS['playtender'].basepage}/plan/${uaid}
Wait Until Page Contains ${uaid} 60
# Wait Until Page Contains План ${uaid} 60
PlanFormOpenByUAID
[Arguments] ${uaid}
PlanOpenByUAID ${uaid}
# Click Element xpath=//a[contains(@href, '/plan/update')][1]
Дочекатися і Клікнути jquery=${planEditButton}
Wait Until Page Contains Element xpath=//a[contains(@data-url,'#general-form-popup')] 60
# Wait Until Page Contains Редагування 60
Sleep 1
PlanUpdateItemQuantity
[Arguments] ${wrapper} ${quantity}
${quantity_srt}= Convert To String ${quantity}
JsSetScrollToElementBySelector ${wrapper} [id$='-quantity']
Input text jquery=${wrapper} [id$='-quantity'] ${quantity_srt}
PlanUpdateItemDeliveryEndDate
[Arguments] ${wrapper} ${delivery_end_date}
${date}= convert_isodate_to_site_datetime ${delivery_end_date}
JsInputHiddenText ${wrapper} [id$='-delivery_end_date'] ${date}
PlanUpdateItemDeliveryEndDateNew
[Arguments] ${wrapper} ${delivery_end_date}
${date}= convert_isodate_to_site_date ${delivery_end_date}
JsInputHiddenText ${wrapper} [id$='-delivery_end_date'] ${date}
PlanUpdateSave
JsSetScrollToElementBySelector \#submitBtn
Click Element xpath=//*[@id='submitBtn']
Sleep 1
Wait Until Page Contains План оновлений, дочекайтесь опублікування на сайті уповноваженого органу. 60
Click Element xpath=//div[contains(@class, 'jconfirm-box')]//button[contains(@class, 'btn btn-default waves-effect waves-light btn-lg')]
Wait For Sync Tender 60
JsInputHiddenText
[Arguments] ${selector} ${text}
Execute JavaScript jQuery("${selector}").val("${text}");
JsSetScrollToElementBySelector
[Arguments] ${selector}
Execute JavaScript scrollToElement("${selector}", 0, 10);
Sleep 100ms
JsCollapseShowAndScroll
[Arguments] ${selector}
Execute JavaScript jQuery("${selector}").collapse("show");
Sleep 500ms
JsSetScrollToElementBySelector ${selector}
JsTabShowAndScroll
[Arguments] ${selector}
Execute JavaScript jQuery("${selector}").tab("show");
Sleep 300ms
JsSetScrollToElementBySelector ${selector}
GetDictionaryKeyExist [Arguments] ${Dictionary Name} ${Key}
Run Keyword And Return Status Dictionary Should Contain Key ${Dictionary Name} ${Key}
GetValueFromDictionaryByKey [Arguments] ${Dictionary Name} ${Key}
${KeyIsPresent}= Run Keyword And Return Status Dictionary Should Contain Key ${Dictionary Name} ${Key}
${Value}= Run Keyword If ${KeyIsPresent} Get From Dictionary ${Dictionary Name} ${Key}
Return From Keyword ${Value}
GenerateFakeDocument
${file_path} ${file_name} ${file_content}= op_robot_tests.tests_files.service_keywords.Create Fake Doc
[return] ${file_path}
GenerateFakeText
${text}= Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
[return] ${text}
WaitPageSyncing
[Arguments] ${timeout}
${passed}= Run Keyword And Return Status Wait Until Keyword Succeeds ${timeout} s 0 s GetPageSyncingStatus
Run Keyword Unless ${passed} Fatal Error Sync Finish not finish in ${timeout} sec
GetPageSyncingStatus
Sleep 2
Reload Page
Sleep 1
Page Should Not Contain Element jquery=.wrapper .card-box .fa.fa-refresh
WaitTenderAuctionEnd
[Arguments] ${timeout}
${passed}= Run Keyword And Return Status Wait Until Keyword Succeeds ${timeout} s 0 s GetTenderAuctionEndStatus
Run Keyword Unless ${passed} Fatal Error Tender not changed status from active.auction in ${timeout} sec
GetTenderAuctionEndStatus
Sleep 60
Reload Page
Sleep 5
${tenderStatus}= get_invisible_text xpath=//*[contains(@class, 'hidden opstatus')]
Should Not Be Equal As Strings ${tenderStatus} active.auction
Input Float
[Arguments] ${input_jquery_selector} ${value}
${value}= convert_float_to_string ${value}
Input Text jquery=${input_jquery_selector} ${value}
Input Float Multiply100
[Arguments] ${input_jquery_selector} ${value}
${value}= multiply_hundred ${value}
Input Float ${input_jquery_selector} ${value}
Input DateTime
[Arguments] ${input_jquery_selector} ${date}
${date}= convert_datetime_for_delivery ${date}
${date}= Convert Date ${date} %d.%m.%Y %H:%M
Input Text jquery=${input_jquery_selector} ${date}
Input DateTime XPath
[Arguments] ${input_selector} ${date}
${date}= convert_datetime_for_delivery ${date}
${date}= Convert Date ${date} %d.%m.%Y %H:%M
Input Text xpath=//${input_selector} ${date}
Input Converted DateTime
[Arguments] ${input_jquery_selector} ${date}
Input Text jquery=${input_jquery_selector} ${date}
sleep 1s
execute javascript $("${input_jquery_selector}").blur();
sleep 100ms
Input Text With Checking Input Isset
[Arguments] ${input_jquery_selector} ${text}
Log ${input_jquery_selector}
${input_isset}= Run Keyword And Return Status Page Should Contain Element jquery=${input_jquery_selector}
Run Keyword If ${input_isset} Input Text jquery=${input_jquery_selector} ${text}
Input Text With Checking Input Isset XPath
[Arguments] ${input_selector} ${text}
Log ${input_selector}
${input_isset}= Run Keyword And Return Status Page Should Contain Element xpath=//${input_selector}
Run Keyword If ${input_isset} Input Text xpath=//${input_selector} ${text}
Select From List By Label With Checking Input Isset XPath
[Arguments] ${input_selector} ${text}
Log ${input_selector}
${input_isset}= Run Keyword And Return Status Page Should Contain Element xpath=//${input_selector}
Run Keyword If ${input_isset} Select From List By Label xpath=//${input_selector} ${text}
GetInputProcTypeByProcurementMethodType
[Arguments] ${procurementMethodType}
${playtender_proc_type}= Convert_to_Lowercase ${procurementMethodType}
${playtender_proc_type}= Remove String ${playtender_proc_type} \.
${playtender_proc_type}= Set Variable If '${playtender_proc_type}' == 'belowthreshold' ${EMPTY} ${playtender_proc_type}
[return] ${playtender_proc_type}
### EOF - HELPERS ###
Дочекатися і Клікнути
[Arguments] ${locator}
Wait Until Keyword Succeeds 15 x 1 s Element Should Be Visible ${locator}
Scroll To Element ${locator}
Click Element ${locator}
Scroll To Element
[Arguments] ${locator}
${elem_vert_pos}= Get Vertical Position ${locator}
Execute Javascript window.scrollTo(0,${elem_vert_pos - 300});
CheckAlertMessageAndCloseIt
Дочекатися і Клікнути xpath=//div[@class='closeIcon'][contains(.,'×')]