Skip to content

Commit 1e51956

Browse files
authored
Merge pull request #1351 from seleniumbase/fix-behave-issue-with-escaped-characters
Fix issue with escaped characters in Behave ".feature" files
2 parents 22afd7d + 6297ee0 commit 1e51956

File tree

4 files changed

+36
-15
lines changed

4 files changed

+36
-15
lines changed

examples/behave_bdd/ReadMe.md

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -13,18 +13,18 @@ Dashboard: /Users/michael/github/SeleniumBase/examples/behave_bdd/dashboard.html
1313
Feature: SeleniumBase scenarios for the RealWorld App # features/realworld.feature:1
1414

1515
Scenario: Verify RealWorld App (log in / sign out) # features/realworld.feature:3
16-
Given Open "seleniumbase.io/realworld/login" # ../../sbase/steps.py:4
17-
And Clear Session Storage # ../../sbase/steps.py:374
18-
When Type "demo_user" into "#username" # ../../sbase/steps.py:22
19-
And Type "secret_pass" into "#password" # ../../sbase/steps.py:22
20-
And Do MFA "GAXG2MTEOR3DMMDG" into "#totpcode" # ../../sbase/steps.py:179
21-
Then Assert exact text "Welcome!" in "h1" # ../../sbase/steps.py:75
22-
And Highlight "img#image1" # ../../sbase/steps.py:82
23-
And Click 'a:contains("This Page")' # ../../sbase/steps.py:13
24-
And Save screenshot to logs # ../../sbase/steps.py:107
25-
When Click link "Sign out" # ../../sbase/steps.py:91
26-
Then Assert element 'a:contains("Sign in")' # ../../sbase/steps.py:52
27-
And Assert text "You have been signed out!" # ../../sbase/steps.py:68
16+
Given Open "seleniumbase.io/realworld/login" # ../../sbase/steps.py:10
17+
And Clear Session Storage # ../../sbase/steps.py:389
18+
When Type "demo_user" into "#username" # ../../sbase/steps.py:28
19+
And Type "secret_pass" into "#password" # ../../sbase/steps.py:28
20+
And Do MFA "GAXG2MTEOR3DMMDG" into "#totpcode" # ../../sbase/steps.py:192
21+
Then Assert exact text "Welcome!" in "h1" # ../../sbase/steps.py:85
22+
And Highlight "img#image1" # ../../sbase/steps.py:93
23+
And Click 'a:contains("This Page")' # ../../sbase/steps.py:19
24+
And Save screenshot to logs # ../../sbase/steps.py:118
25+
When Click link "Sign out" # ../../sbase/steps.py:102
26+
Then Assert element 'a:contains("Sign in")' # ../../sbase/steps.py:60
27+
And Assert text "You have been signed out!" # ../../sbase/steps.py:77
2828
✅ Scenario Passed!
2929

3030
- Dashboard: /Users/michael/github/SeleniumBase/examples/behave_bdd/dashboard.html
@@ -72,7 +72,7 @@ Feature: SeleniumBase scenarios for the Calculator App # features/calculator.fea
7272
Took 0m1.672s
7373
```
7474

75-
🔵🐝⚪ With the Dashboard enabled, you'll get one of these:
75+
🐝⚪ With the Dashboard enabled, you'll get one of these:
7676

7777
<img src="https://seleniumbase.io/cdn/img/sb_behave_dashboard.png" title="SeleniumBase" width="600">
7878

integrations/behave/ReadMe.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ Feature: SeleniumBase scenarios for the Calculator App # features/calculator.fea
6969
Took 0m1.672s
7070
```
7171

72-
🔵🐝⚪ With the Dashboard enabled, you'll get one of these:
72+
🐝⚪ With the Dashboard enabled, you'll get one of these:
7373

7474
<img src="https://seleniumbase.io/cdn/img/sb_behave_dashboard.png" title="SeleniumBase" width="600">
7575

sbase/steps.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
11
from behave import step
22

33

4+
def normalize_text(text):
5+
text = text.replace("\\\\", "\\").replace("\\t", "\t").replace("\\n", "\n")
6+
text = text.replace('\\"', '"').replace("\\'", "'")
7+
return text
8+
9+
410
@step("Open '{url}'")
511
@step('Open "{url}"')
612
@step("Open URL '{url}'")
@@ -33,6 +39,7 @@ def click_element(context, selector):
3339
@step('Into "{selector}" type \'{text}\'')
3440
def type_text(context, selector, text):
3541
sb = context.sb
42+
text = normalize_text(text)
3643
sb.type(selector, text)
3744

3845

@@ -46,6 +53,7 @@ def type_text(context, selector, text):
4653
@step('Into "{selector}" add \'{text}\'')
4754
def add_text(context, text, selector):
4855
sb = context.sb
56+
text = normalize_text(text)
4957
sb.add_text(selector, text)
5058

5159

@@ -62,20 +70,23 @@ def assert_element(context, selector):
6270
@step('Assert text "{text}" in \'{selector}\'')
6371
def assert_text_in_element(context, text, selector):
6472
sb = context.sb
73+
text = normalize_text(text)
6574
sb.assert_text(text, selector)
6675

6776

6877
@step("Assert text '{text}'")
6978
@step('Assert text "{text}"')
7079
def assert_text(context, text):
7180
sb = context.sb
81+
text = normalize_text(text)
7282
sb.assert_text(text)
7383

7484

7585
@step("Assert exact text '{text}' in '{selector}'")
7686
@step('Assert exact text "{text}" in "{selector}"')
7787
def assert_exact_text(context, text, selector):
7888
sb = context.sb
89+
text = normalize_text(text)
7990
sb.assert_exact_text(text, selector)
8091

8192

@@ -139,6 +150,7 @@ def go_forward(context):
139150
@step('JS type text "{text}" into \'{selector}\'')
140151
def js_type(context, text, selector):
141152
sb = context.sb
153+
text = normalize_text(text)
142154
sb.js_type(selector, text)
143155

144156

@@ -148,6 +160,7 @@ def js_type(context, text, selector):
148160
@step('Set value of \'{selector}\' to "{text}"')
149161
def set_value(context, text, selector):
150162
sb = context.sb
163+
text = normalize_text(text)
151164
sb.set_value(selector, text)
152165

153166

@@ -258,6 +271,7 @@ def hover_and_click(context, hover_selector, click_selector):
258271
@step('Find "{selector}" and select \'{text}\'')
259272
def select_option_by_text(context, selector, text):
260273
sb = context.sb
274+
text = normalize_text(text)
261275
sb.select_option_by_text(selector, text)
262276

263277

@@ -267,6 +281,7 @@ def select_option_by_text(context, selector, text):
267281
@step('Find "{selector}" and select \'{text}\' by {option}')
268282
def select_option_by_option(context, selector, text, option):
269283
sb = context.sb
284+
text = normalize_text(text)
270285
if option.startswith("'") or option.startswith('"'):
271286
option = option[1:]
272287
if option.endswith("'") or option.endswith('"'):
@@ -440,13 +455,15 @@ def assert_element_not_visible(context, selector):
440455
@step('Assert link text "{text}"')
441456
def assert_link_text(context, text):
442457
sb = context.sb
458+
text = normalize_text(text)
443459
sb.assert_link_text(text)
444460

445461

446462
@step("Assert title '{title}'")
447463
@step('Assert title "{title}"')
448464
def assert_title(context, title):
449465
sb = context.sb
466+
title = normalize_text(title)
450467
sb.assert_title(title)
451468

452469

@@ -494,6 +511,7 @@ def assert_attribute(context, selector, attribute):
494511
@step('In \'{selector}\' assert attribute/value "{attribute}"/"{value}"')
495512
def assert_attribute_has_value(context, selector, attribute, value):
496513
sb = context.sb
514+
value = normalize_text(value)
497515
sb.assert_attribute(selector, attribute, value)
498516

499517

@@ -542,20 +560,23 @@ def deferred_assert_element_present(context, selector):
542560
@step('Deferred assert text "{text}" in \'{selector}\'')
543561
def deferred_assert_text_in_element(context, text, selector):
544562
sb = context.sb
563+
text = normalize_text(text)
545564
sb.deferred_assert_text(text, selector)
546565

547566

548567
@step("Deferred assert text '{text}'")
549568
@step('Deferred assert text "{text}"')
550569
def deferred_assert_text(context, text):
551570
sb = context.sb
571+
text = normalize_text(text)
552572
sb.deferred_assert_text(text)
553573

554574

555575
@step("Deferred assert exact text '{text}' in '{selector}'")
556576
@step('Deferred assert exact text "{text}" in "{selector}"')
557577
def deferred_assert_exact_text(context, text, selector):
558578
sb = context.sb
579+
text = normalize_text(text)
559580
sb.deferred_assert_exact_text(text, selector)
560581

561582

seleniumbase/__version__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
# seleniumbase package
2-
__version__ = "3.2.5"
2+
__version__ = "3.2.6"

0 commit comments

Comments
 (0)