diff --git a/README.md b/README.md index bc3caed3..24b2b58e 100755 --- a/README.md +++ b/README.md @@ -217,8 +217,9 @@ from seleniumbase import BaseCase class MyTestClass(BaseCase): - def test_basic(self): - self.open("https://store.xkcd.com/search") + def test_basics(self): + url = "https://store.xkcd.com/collections/posters" + self.open(url) self.type('input[name="q"]', "xkcd book") self.click('input[value="Search"]') self.assert_text("xkcd: volume 0", "h3") @@ -228,10 +229,8 @@ class MyTestClass(BaseCase): self.click('a[rel="license"]') self.assert_text("free to copy and reuse") self.go_back() - self.click_link_text("About") + self.click_link("About") self.assert_exact_text("xkcd.com", "h2") - self.click_link_text("geohashing") - self.assert_element("#comic img") ``` * By default, **[CSS Selectors](https://www.w3schools.com/cssref/css_selectors.asp)** are used for finding page elements. diff --git a/examples/basic_test.py b/examples/basic_test.py index 78509684..8ced79ac 100755 --- a/examples/basic_test.py +++ b/examples/basic_test.py @@ -3,13 +3,13 @@ from seleniumbase import BaseCase class MyTestClass(BaseCase): - def test_basic(self): + def test_basics(self): self.open("https://store.xkcd.com/search") self.type('input[name="q"]', "xkcd book\n") self.assert_text("xkcd book", "div.results") self.open("https://xkcd.com/353/") self.click('a[rel="license"]') self.go_back() - self.click_link_text("About") - self.click_link_text("comic #249") + self.click_link("About") + self.click_link("comic #249") self.assert_element('img[alt*="Chess"]') diff --git a/examples/capabilities/ReadMe.md b/examples/capabilities/ReadMe.md index c0ca822c..ba7416c0 100755 --- a/examples/capabilities/ReadMe.md +++ b/examples/capabilities/ReadMe.md @@ -76,7 +76,7 @@ If you pass ``"*"`` into the ``"name"`` field of ``--cap-string``, the name will ```bash pytest test_swag_labs.py --cap-string='{"browserName":"chrome","name":"*"}' --server="127.0.0.1" --browser=chrome ``` -Example name: ``"my_first_test.MyTestClass.test_basic"`` +Example name: ``"my_first_test.MyTestClass.test_basics"`` ### Using a local Selenium Grid diff --git a/examples/my_first_test.py b/examples/my_first_test.py index 901c50e7..e2939f56 100755 --- a/examples/my_first_test.py +++ b/examples/my_first_test.py @@ -3,8 +3,9 @@ from seleniumbase import BaseCase class MyTestClass(BaseCase): - def test_basic(self): - self.open("https://store.xkcd.com/search") + def test_basics(self): + url = "https://store.xkcd.com/collections/posters" + self.open(url) self.type('input[name="q"]', "xkcd book") self.click('input[value="Search"]') self.assert_text("xkcd: volume 0", "h3") @@ -14,10 +15,8 @@ class MyTestClass(BaseCase): self.click('a[rel="license"]') self.assert_text("free to copy and reuse") self.go_back() - self.click_link_text("About") + self.click_link("About") self.assert_exact_text("xkcd.com", "h2") - self.click_link_text("geohashing") - self.assert_element("#comic img") #### @@ -77,8 +76,8 @@ class MyTestClass(BaseCase): # self.assert_text() = self.assert_text_visible() # self.find_text() = self.wait_for_text_visible() # = self.wait_for_text() - # self.click_link_text(text) = self.click(link=text) - # = self.click_link(text) + # self.click_link(text) = self.click(link=text) + # = self.click_link_text(text) # * self.get(url) is SPECIAL: * # If {url} is a valid URL, self.get() works just like self.open() # Otherwise {url} becomes a selector for calling self.get_element() diff --git a/examples/offline_examples/test_demo_page.py b/examples/offline_examples/test_demo_page.py index ea649e93..7faf5074 100755 --- a/examples/offline_examples/test_demo_page.py +++ b/examples/offline_examples/test_demo_page.py @@ -89,7 +89,7 @@ class OfflineTestClass(BaseCase): self.assert_true(self.is_selected(".fBox")) self.switch_to_default_content() - # Assert link text - Use click_link_text() to click + # Assert link text - Use click_link() to click self.assert_link_text("seleniumbase.com") self.assert_link_text("SeleniumBase on GitHub") self.assert_link_text("seleniumbase.io") diff --git a/examples/presenter/ReadMe.md b/examples/presenter/ReadMe.md index 5ef11247..edfa0bad 100755 --- a/examples/presenter/ReadMe.md +++ b/examples/presenter/ReadMe.md @@ -158,7 +158,7 @@ class MyPresenterClass(BaseCase): code=( 'from seleniumbase import BaseCase\n\n' 'class MyTestClass(BaseCase):\n\n' - ' def test_basic(self):\n' + ' def test_basics(self):\n' ' self.open("https://store.xkcd.com/search")\n' ' self.type(\'input[name="q"]\', "xkcd book\\n")\n' ' self.assert_text("xkcd: volume 0", "h3")\n' @@ -168,14 +168,14 @@ class MyPresenterClass(BaseCase): ' self.click(\'a[rel="license"]\')\n' ' self.assert_text("free to copy and reuse")\n' ' self.go_back()\n' - ' self.click_link_text("About")\n' + ' self.click_link("About")\n' ' self.assert_exact_text("xkcd.com", "h2")')) self.add_slide( "

Highlight code in slides:

", code=( 'from seleniumbase import BaseCase\n\n' 'class MyTestClass(BaseCase):\n\n' - ' def test_basic(self):\n' + ' def test_basics(self):\n' ' self.open("https://store.xkcd.com/search")\n' ' self.type(\'input[name="q"]\', "xkcd book\\n")\n' ' self.assert_text("xkcd: volume 0", "h3")')) diff --git a/examples/presenter/core_presentation.py b/examples/presenter/core_presentation.py index c435110e..36875be6 100644 --- a/examples/presenter/core_presentation.py +++ b/examples/presenter/core_presentation.py @@ -16,15 +16,15 @@ class MyChartMakerClass(BaseCase): code=( 'from seleniumbase import BaseCase\n\n' 'class MyTestClass(BaseCase):\n\n' - ' def test_basic(self):\n' + ' def test_basics(self):\n' ' self.open("https://store.xkcd.com/search")\n' ' self.type(\'input[name="q"]\', "xkcd book\\n")\n' ' self.assert_text("xkcd book", "div.results")\n' ' self.open("https://xkcd.com/353/")\n' ' self.click(\'a[rel="license"]\')\n' ' self.go_back()\n' - ' self.click_link_text("About")\n' - ' self.click_link_text("comic #249")\n' + ' self.click_link("About")\n' + ' self.click_link("comic #249")\n' ' self.assert_element(\'img[alt*="Chess"]\')\n')) self.add_slide( "

Command-line options. Examples:

", diff --git a/examples/presenter/my_presentation.py b/examples/presenter/my_presentation.py index fc575fb2..78872ad6 100755 --- a/examples/presenter/my_presentation.py +++ b/examples/presenter/my_presentation.py @@ -45,7 +45,7 @@ class MyPresenterClass(BaseCase): code=( 'from seleniumbase import BaseCase\n\n' 'class MyTestClass(BaseCase):\n\n' - ' def test_basic(self):\n' + ' def test_basics(self):\n' ' self.open("https://store.xkcd.com/search")\n' ' self.type(\'input[name="q"]\', "xkcd book\\n")\n' ' self.assert_text("xkcd: volume 0", "h3")\n' @@ -55,14 +55,14 @@ class MyPresenterClass(BaseCase): ' self.click(\'a[rel="license"]\')\n' ' self.assert_text("free to copy and reuse")\n' ' self.go_back()\n' - ' self.click_link_text("About")\n' + ' self.click_link("About")\n' ' self.assert_exact_text("xkcd.com", "h2")')) self.add_slide( "

Highlight code in slides:

", code=( 'from seleniumbase import BaseCase\n\n' 'class MyTestClass(BaseCase):\n\n' - ' def test_basic(self):\n' + ' def test_basics(self):\n' ' self.open("https://store.xkcd.com/search")\n' ' self.type(\'input[name="q"]\', "xkcd book\\n")\n' ' self.assert_text("xkcd: volume 0", "h3")')) diff --git a/examples/raw_parameter_script.py b/examples/raw_parameter_script.py index efeb2e1e..c9893947 100755 --- a/examples/raw_parameter_script.py +++ b/examples/raw_parameter_script.py @@ -25,7 +25,7 @@ except (ImportError, ValueError): # Example run command: "python raw_parameter_script.py" from my_first_test import MyTestClass # (relative imports DON'T work) - sb = MyTestClass("test_basic") + sb = MyTestClass("test_basics") sb.browser = "chrome" sb.headless = False sb.headed = False @@ -86,7 +86,7 @@ except (ImportError, ValueError): sb.setUp() try: - sb.test_basic() + sb.test_basics() finally: sb.tearDown() del sb diff --git a/examples/test_demo_site.py b/examples/test_demo_site.py index e7a9eddd..662ab537 100755 --- a/examples/test_demo_site.py +++ b/examples/test_demo_site.py @@ -89,7 +89,7 @@ class MyTestClass(BaseCase): self.assert_link_text("seleniumbase.io") # Click link text - self.click_link_text("SeleniumBase Demo Page") + self.click_link("SeleniumBase Demo Page") # Assert exact text self.assert_exact_text("Demo Page", "h1") diff --git a/examples/tour_examples/bootstrap_xkcd_tour.py b/examples/tour_examples/bootstrap_xkcd_tour.py index a8a40e64..24f4b141 100755 --- a/examples/tour_examples/bootstrap_xkcd_tour.py +++ b/examples/tour_examples/bootstrap_xkcd_tour.py @@ -3,7 +3,7 @@ from seleniumbase import BaseCase class MyTestClass(BaseCase): - def test_basic(self): + def test_bootstrap_tour(self): self.open('https://xkcd.com/1117/') self.assert_element('img[alt="My Sky"]') self.create_bootstrap_tour() diff --git a/examples/translations/english_test_1.py b/examples/translations/english_test_1.py index e532acd0..191eabc5 100755 --- a/examples/translations/english_test_1.py +++ b/examples/translations/english_test_1.py @@ -17,5 +17,5 @@ class MyTestClass(BaseCase): self.click('a[rel="license"]') self.assert_text("back to this page") self.go_back() - self.click_link_text("About") + self.click_link("About") self.assert_exact_text("xkcd.com", "h2") diff --git a/help_docs/chinese.md b/help_docs/chinese.md index 88c902e0..f5940fd8 100644 --- a/help_docs/chinese.md +++ b/help_docs/chinese.md @@ -81,9 +81,11 @@ pip install seleniumbase

下载 webdriver:

SeleniumBase 下载 webdriver 驱动到 [seleniumbase/drivers](https://github.com/seleniumbase/SeleniumBase/tree/master/seleniumbase/drivers) 文件夹下, 使用 ``install`` 命令: + ```bash seleniumbase install chromedriver ``` + * 你可能需要不同的 webdriver 来对应各种网页浏览器来完成自动化测试,例如: ``chromedriver`` 对应 Chrome, ``edgedriver`` 对应 Edge, ``geckodriver`` 对应 Firefox, ``operadriver`` 对应 Opera, ``iedriver`` 对应 Internet Explorer. * 如果你需要安装最新版本的浏览器驱动, 以以下命令获取最新版本浏览器驱动 (因兼容性原因,默认下载的版本为 chromedriver 2.44 ): ```bash @@ -96,6 +98,7 @@ seleniumbase install chromedriver latest cd examples/ pytest my_first_test.py ``` + * 如果没指定版本则默认运行的浏览器驱动为 chromedriver, 使用指定版本的命令为: ``--browser=BROWSER``. * Linux 中 ``--headless`` 为默认值 (无界面运行).你也可以在任何系统中运行无界面模式. 如果你的 Linux服务器有 GUI 界面,你也需要在界面中查看浏览器运行用例的过程,你可以添加 ``--headed`` 或 ``--gui``. @@ -114,18 +117,19 @@ from seleniumbase import BaseCase class MyTestClass(BaseCase): - def test_basic(self): + def test_basics(self): + self.open("https://store.xkcd.com/search") + self.type('input[name="q"]', "xkcd book") + self.click('input[value="Search"]') + self.assert_text("xkcd: volume 0", "h3") self.open("https://xkcd.com/353/") self.assert_title("xkcd: Python") self.assert_element('img[alt="Python"]') self.click('a[rel="license"]') self.assert_text("free to copy and reuse") self.go_back() - self.click("link=About") - self.assert_text("xkcd.com", "h2") - self.open("://store.xkcd.com/collections/everything") - self.type("input.search-input", "xkcd book\n") - self.assert_exact_text("xkcd: volume 0", "h3") + self.click_link("About") + self.assert_exact_text("xkcd.com", "h2") ``` * 默认情况下, **[CSS Selectors](https://www.w3schools.com/cssref/css_selectors.asp)** 用来查找页面元素. @@ -158,6 +162,7 @@ self.save_screenshot(FILE_NAME) # 保存当前页面的截图 ``` [chinese_test_1.py](https://github.com/seleniumbase/SeleniumBase/blob/master/examples/translations/chinese_test_1.py): + ```python from seleniumbase.translate.chinese import 硒测试用例 @@ -311,6 +316,7 @@ pytest --collect-only -q 您可以在脚本中使用以下内容来帮助您调试问题: (如果使用ipdb,请确保将“-s”添加到命令行选项中,除非已经在pytest.ini中) + ```python import time; time.sleep(5) # Makes the test wait and do nothing for 5 seconds. import ipdb; ipdb.set_trace() # Enter debugging mode. n = next, c = continue, s = step. @@ -580,6 +586,7 @@ self.type(selector, text) # 用指定的值更新来自指定元素的文本。 ```python self.type("input#id_value", "2012") ``` + 您也可以使用self.add_text()或WebDriver .send_keys()命令,但是如果文本框中已经有文本,这些命令不会首先清除文本框 如果您想键入特殊的键,这也很容易。这里有一个例子: @@ -605,6 +612,7 @@ attribute = self.get_attribute("#comic img", "title") ```python self.wait_for_element_present("div.my_class", timeout=10) ``` + (注意: 您也可以使用: ``self.assert_element_present(ELEMENT)``)

在数秒内断言页面上元素的可见性:

@@ -612,6 +620,7 @@ self.wait_for_element_present("div.my_class", timeout=10) ```python self.wait_for_element_visible("a.my_class", timeout=5) ``` + (注意: 这个的简单版本是 ``self.find_element(ELEMENT)`` 和 ``self.assert_element(ELEMENT)``. find_element() version 返回元素) 由于上面的行返回元素,您可以将其与.click()组合起来,如下所示: @@ -638,6 +647,7 @@ self.click('a[name*="partial_name"]') self.assert_text("Make it so!", "div#trek div.picard div.quotes") self.assert_text("Tea. Earl Grey. Hot.", "div#trek div.picard div.quotes", timeout=3) ``` + (注意: ``self.find_text(TEXT, ELEMENT)`` 和 ``self.wait_for_text(TEXT, ELEMENT)`` 干了同一件事. 为了向后字兼容性,保留了较旧的方法名,但默认超时可能不同.)

断言 anything

@@ -651,6 +661,7 @@ self.assert_equal(var1, var2)

有用的条件语句 (with creative examples in action)

is_element_visible(selector) # is an element visible on a page + ```python if self.is_element_visible('div#warning'): print("Red Alert: Something bad might be happening!") @@ -674,6 +685,7 @@ def is_there_a_cloaked_klingon_ship_on_this_page(): ``` is_text_visible(text, selector) # is text visible on a page + ```python def get_mirror_universe_captain_picard_superbowl_ad(superbowl_year): selector = "div.superbowl_%s div.commercials div.transcript div.picard" % superbowl_year @@ -776,6 +788,7 @@ referral_link = '''Free-Referral Button! self.execute_script('''document.body.innerHTML = \"%s\"''' % referral_link) self.click("a.analytics") # Clicks the generated button ``` + (由于大众需求,这个流量生成示例已经被嵌入到SeleniumBase中 ``self.generate_referral(start_page, end_page)`` 和 ``self.generate_traffic(start_page, end_page, loops)`` 方法中.)

使用延迟的断言:

@@ -811,6 +824,7 @@ self.driver.delete_all_cookies() capabilities = self.driver.capabilities self.driver.find_elements_by_partial_link_text("GitHub") ``` + (通常,您会希望在可用时使用带方法的SeleniumBase版本.)

自动重试失败的测试

diff --git a/help_docs/desired_capabilities.md b/help_docs/desired_capabilities.md index 0e321155..5cf829d7 100755 --- a/help_docs/desired_capabilities.md +++ b/help_docs/desired_capabilities.md @@ -76,7 +76,7 @@ If you pass ``"*"`` into the ``"name"`` field of ``--cap-string``, the name will ```bash pytest test_swag_labs.py --cap-string='{"browserName":"chrome","name":"*"}' --server="127.0.0.1" --browser=chrome ``` -Example name: ``"my_first_test.MyTestClass.test_basic"`` +Example name: ``"my_first_test.MyTestClass.test_basics"``

Using a local Selenium Grid

diff --git a/help_docs/syntax_formats.md b/help_docs/syntax_formats.md index 8404126e..f037ce49 100755 --- a/help_docs/syntax_formats.md +++ b/help_docs/syntax_formats.md @@ -25,7 +25,7 @@ class MyTestClass(BaseCase): self.click("#myButton") self.assert_element("tbody#tbodyId") self.assert_text("Automation Practice", "h3") - self.click_link_text("SeleniumBase Demo Page") + self.click_link("SeleniumBase Demo Page") self.assert_exact_text("Demo Page", "h1") self.assert_no_js_errors() ``` diff --git a/integrations/node_js/my_first_test.py b/integrations/node_js/my_first_test.py index 4ea77ff1..cce4957b 100755 --- a/integrations/node_js/my_first_test.py +++ b/integrations/node_js/my_first_test.py @@ -3,8 +3,9 @@ from seleniumbase import BaseCase class MyTestClass(BaseCase): - def test_basic(self): - self.open("https://store.xkcd.com/search") + def test_basics(self): + url = "https://store.xkcd.com/collections/posters" + self.open(url) self.type('input[name="q"]', "xkcd book") self.click('input[value="Search"]') self.assert_text("xkcd: volume 0", "h3") @@ -14,7 +15,5 @@ class MyTestClass(BaseCase): self.click('a[rel="license"]') self.assert_text("free to copy and reuse") self.go_back() - self.click_link_text("About") + self.click_link("About") self.assert_exact_text("xkcd.com", "h2") - self.click_link_text("geohashing") - self.assert_element("#comic img") diff --git a/integrations/node_js/test_demo_site.py b/integrations/node_js/test_demo_site.py index e7a9eddd..662ab537 100755 --- a/integrations/node_js/test_demo_site.py +++ b/integrations/node_js/test_demo_site.py @@ -89,7 +89,7 @@ class MyTestClass(BaseCase): self.assert_link_text("seleniumbase.io") # Click link text - self.click_link_text("SeleniumBase Demo Page") + self.click_link("SeleniumBase Demo Page") # Assert exact text self.assert_exact_text("Demo Page", "h1")