├── .gitignore ├── .travis.yml ├── 2.9 ├── Alert.md ├── AndWait.md ├── Assertion.md ├── BaseURL.md ├── Browsers.md ├── Build.md ├── Commonly.md ├── DDT.md ├── Database.md ├── Debugging.md ├── Extensions.md ├── Features.md ├── Flow.md ├── Format.md ├── Install.md ├── Introduction.md ├── JavaScript.md ├── Locating.md ├── LocationStrategies.md ├── Mapping.md ├── Open.md ├── Page.md ├── Patterns.md ├── README.md ├── Run.md ├── SUMMARY.md ├── Script.md ├── Selenese.md ├── Suites.md ├── TestDesignIntro.md ├── TestSuite.md ├── Troubleshooting.md ├── Types.md ├── Validating.md ├── Variables.md ├── Verify.md ├── WaitFor.md ├── Wrapping.md ├── book.json ├── echo.md ├── images │ ├── chapt3_img01_IDE_Installation.webp │ ├── chapt3_img02_IDE_Installation.webp │ ├── chapt3_img03_IDE_Installation.webp │ ├── chapt3_img04_IDE_Installation.webp │ ├── chapt3_img05_IDE_open.webp │ ├── chapt3_img06_IDE_features.webp │ ├── chapt3_img07_Speed_Control.webp │ ├── chapt3_img08_Run_All.webp │ ├── chapt3_img09_Run.webp │ ├── chapt3_img10_Pause.webp │ ├── chapt3_img11_Resume.webp │ ├── chapt3_img12_Step.webp │ ├── chapt3_img13_TestRunner_Mode.webp │ ├── chapt3_img14_Apply_Rollup_Rules.webp │ ├── chapt3_img15_Record.webp │ ├── chapt3_img16_Table_Format.webp │ ├── chapt3_img17_Entry_Fields.webp │ ├── chapt3_img18_Bottom_Box.webp │ ├── chapt3_img19_Bottom_Box_Ref.webp │ ├── chapt3_img21_BaseURL_prod.webp │ ├── chapt3_img22_BaseURL_beta.webp │ ├── chapt3_img23_IDE_Locator_Assistance.webp │ ├── chapt3_img27_Trouble_extension.webp │ ├── chapt3_img28_Trouble_timing.webp │ ├── chapt3_img29_Trouble_param.webp │ └── chapt3_img32_Extensions_install.webp └── styles │ └── website.css ├── 3.9 ├── README.md ├── SUMMARY.md ├── arguments.md ├── book.json ├── code-export.md ├── command-line-runner.md ├── commands.md ├── control-flow.md ├── faq.md ├── getting-started.md └── styles │ └── website.css ├── CNAME ├── Gruntfile.js ├── LICENSE ├── README.md ├── book.json └── package.json /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | 8 | # Runtime data 9 | pids 10 | *.pid 11 | *.seed 12 | *.pid.lock 13 | 14 | # Directory for instrumented libs generated by jscoverage/JSCover 15 | lib-cov 16 | 17 | # Coverage directory used by tools like istanbul 18 | coverage 19 | 20 | # nyc test coverage 21 | .nyc_output 22 | 23 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 24 | .grunt 25 | 26 | # Bower dependency directory (https://bower.io/) 27 | bower_components 28 | 29 | # node-waf configuration 30 | .lock-wscript 31 | 32 | # Compiled binary addons (http://nodejs.org/api/addons.html) 33 | build/Release 34 | 35 | # Dependency directories 36 | node_modules/ 37 | jspm_packages/ 38 | 39 | # Typescript v1 declaration files 40 | typings/ 41 | 42 | # Optional npm cache directory 43 | .npm 44 | 45 | # Optional eslint cache 46 | .eslintcache 47 | 48 | # Optional REPL history 49 | .node_repl_history 50 | 51 | # Output of 'npm pack' 52 | *.tgz 53 | 54 | # Yarn Integrity file 55 | .yarn-integrity 56 | 57 | # dotenv environment variables file 58 | .env 59 | 60 | dist/ 61 | _book/ 62 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - "10" 4 | 5 | after_script: 6 | - gitbook install 7 | - cp -r node_modules 3.9/ 8 | - cp -r node_modules 2.9/ 9 | - gitbook build 3.9/ _book 10 | - gitbook build 2.9/ _book/2.9/ 11 | - grunt minify 12 | - cp CNAME _book 13 | - cp book.json _book 14 | - grunt upload 15 | - cd _book 16 | - git init 17 | - git config user.name "${USER_NAME}" 18 | - git config user.email "${USER_EMAIL}" 19 | - git add . 20 | - git commit -m "publish gitbook" 21 | - git push --force --quiet "https://${ACC_TOKEN}@${GH_REF}" master:${BRANCH} 22 | 23 | branches: 24 | only: 25 | - master 26 | -------------------------------------------------------------------------------- /2.9/Alert.md: -------------------------------------------------------------------------------- 1 | # 警告、弹窗和多个窗口 2 | 3 | 假设有一个测试页面,其代码如下所示。 4 | 5 | ```html 6 | 7 | 8 | 9 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | New Window Link 43 | 44 | 45 | 46 |
47 | 48 | 49 | 50 | 51 | ``` 52 | 53 | 用户必须响应警告/确认弹窗,并且将焦点移到新开的弹窗上。幸运的是,Selenium 可以处理 JavaScript 弹窗。 54 | 55 | 在我们开始介绍警告/确认/提示的细节之前,有必要先了解一些共性的基础知识。警告、确认和提示都有下面的一些命令模式: 56 | 57 | | 命令 | 描述 | 58 | | ---- | -------- | 59 | | assertFoo(_pattern_) | 如果模式不匹配弹窗中的文本,抛出错误 | 60 | | assertFooPresent | 如果没有弹窗,抛出错误 | 61 | | assertFooNotPresent | 如果存在任何弹窗,抛出错误 | 62 | | storeFoo(_variable_) | 把弹窗中的文本存储在一个变量中 | 63 | | storeFooPresent(_variable_) | 把弹窗中的文本存储在一个变量中并返回真或假 | 64 | 65 | 当 Selenium 运行时,JavaScript 弹窗将不会出现。这是因为 JavaScript 的函数调用,在运行时被 Selenium 自己的 JavaScript 代码覆盖。然而,没看到弹窗,并不意味着不用处理它。通过调用 AssertFoo(pattern) 来处理弹窗。如果弹窗显示的断言失败了,测试会暂停并提示类似下面的错误信息: 66 | [error] Error: There was an unexpected Confirmation! [Chose an option.] 67 | 68 | ## Alerts 警告弹窗 69 | 70 | 首先介绍警告弹窗,因为这是要处理的最简单的弹窗。首先,在浏览器中打开上面的 HTML 示例文件,单击“显示警告”弹窗按钮。请注意,当你关闭警告弹窗后,页面上会显示“Alert is gone.”。现在,在 Selenium IDE 的录制模式下,重复刚才的操作,注意文本验证命令在关闭弹窗后会自动加到了脚本中。录制好的测试案例将会是下面的样子: 71 | 72 | | 命令 | 目标 | 值 | 73 | | ------------- | ------------------------------------------- | ------------ | 74 | | open | / | | 75 | | click | btnAlert | | 76 | | assertAlert | I'm blocking! | | 77 | | verifyTextPresent | Alert is gone. | | 78 | 79 | 你可能会奇怪,自己并没有添加警告弹窗的断言,这些都是 Selenium IDE 为我们做的处理,Selenium IDE 同时也为我们关闭了警告弹窗。如果你去掉断言命令,然后回放脚本,你会收到以下错误: 80 | [error] Error: There was an unexpected Alert! [I'm blocking!] 81 | 82 | 你必须在脚本中包含一个断言命令来承认弹窗的存在。 83 | 84 | 如果你只是想断言警告弹窗出现了,并不关心它包含的文本是什么,这时可以使用 assertAlertPresent。他将返回真或假,当返回假时,停止测试。 85 | 86 | ## Confirmations 确认弹窗 87 | 88 | 确认弹窗的行为跟警告弹窗类似,assertConfirmation 和 assertConfirmationPresent 提供与警告弹窗命令类似的功能。默认情况下,弹出确认弹窗后,Selenium 会选择“OK”。试着录制下列操作,在示例页面上点击“显示确认弹窗”的按钮,然后在确认弹窗框中选择 “Cancel” 按钮 ,然后断言输出的文本。录制好的测试案例看上去可能像下面这样: 89 | 90 | | 命令 | 目标 | 值 | 91 | | ----------- | ---------------------------------------- | --- | 92 | | open | / | | 93 | | click | btnConfirm | | 94 | | chooseCancelOnNextConfirmation | | | 95 | | assertConfirmation | Choose an option. | | 96 | | verifyTextPresent | Rejected | | 97 | 98 | 99 | chooseCancelOnNextConfirmation 函数告诉 Selenium 所有后续的确认应返回 false。它可以通过调用 chooseOkOnNextConfirmation 来重置。 100 | 101 | 请注意,此测试案例不能正常回放,届时 Selenium 会提示有一个未处理的确认。这是因为 Selenium IDE 录制事件的顺序错误导致的 Click 和 chooseCancelOnNextConfirmation 两个命令的顺序错误。(仔细想想,Selenium 并不知道在你打开一个确认弹窗之前会取消操作)只要交换前后这两个命令的位置,测试案例就会正常工作。 102 | 103 | ## Prompts 提示弹窗 104 | 105 | 提示弹窗的行为跟警告弹窗类似,assertPrompt 和 assertPromptPresent 提供与警告弹窗命令类似的功能。默认情况下,弹出的提示信息后,Selenium 将等待你输入数据。试着录制下列操作,在示例页面上点击“显示提示弹窗”的按钮,然后在提示框中输入 Selenium 。录制好的测试案例看上去可能像下面这样: 106 | 107 | | 命令 | 目标 | 值 | 108 | | ----------- | ---------------------------------------- | --- | 109 | | open | / | | 110 | | answerOnNextPrompt | Selenium! | | 111 | | click | id=btnPrompt | | 112 | | assertPrompt | What’s the best web QA tool? | | 113 | | verifyTextPresent | Selenium! | | 114 | 115 | 如果你在提示弹窗上点选取消按钮,你可能会注意到,answerOnNextPrompt 只会显示一个空白的目标。在提示弹窗上 Selenium 对待取消和一个空白的输入是一样的。 116 | -------------------------------------------------------------------------------- /2.9/AndWait.md: -------------------------------------------------------------------------------- 1 | # AndWait 命令 2 | 3 | 命令(如常见的 click )与 AndWait 后缀命令的区别是,普通命令会执行动作,并以最快的速度继续执行下面的命令,而 AndWait 后缀命令(如 clickAndWait )告诉 Selenium 在动作完成后等待页面加载完成。 4 | 5 | AndWait 后缀命令经常用在浏览器导航到另一个页面或重新加载当前页面时。 6 | 7 | 请注意,如果您在某个动作上使用一个 AndWait 命令,他不触发导航或者刷新,您的测试将会失败。这是因为 Selenium 达到了 AndWait 超时上限,却没有看到任何导航或刷新,导致 Selenium 抛出超时异常。 8 | -------------------------------------------------------------------------------- /2.9/Assertion.md: -------------------------------------------------------------------------------- 1 | # 断言和验证 2 | 3 | 在 “assert”(断言)和 “verify”(验证)之间选择的关键点,取决于对测试失败如何管理以及管理的便利性。如果在检查浏览器显示的是否是预期页面时,测试已经失败,那么在此基础上再检查页面的第一个段落是否正确几乎没有意义了。如果打开的页面不对,你可能想立刻中止测试用例,检查原因并修复问题。另一种情况,你可能希望检查页面上的许多属性,在测试用例碰到第一个失败后并不终止执行,这将允许你检查所有页面上的失败,然后采取适当的行动。“assert”测试失败会中止当前的测试用例,而“verify”测试失败,会继续运行测试用例。 4 | 5 | 使用这个功能的最佳实践是将测试命令进行逻辑上的分组,在每组命令开始前有一个“assert”,后面跟着一个或多个“verify”测试命令。举个例子: 6 | 7 | | 命令 | 目标 | 值 | 8 | | ----------- | ---------------------------------------- | --- | 9 | | open | /download/ | | 10 | | assertTitle | Downloads | | 11 | | verifyText | //h2 | Downloads | 12 | | assertTable | 1.2.1 | Selenium IDE | 13 | | verifyTable | 1.2.2 | June 3,2008 | 14 | | verifyTable | 1.2.3 | 1.0 beta 2 | 15 | 16 | 上面的例子首先打开一个页面,然后比较当前页面的标题与期望值是否一致,来 asserts(断言)当前加载的页面是正确的。只有这个断言测试通过后,才执行以下的命令并“verify”(验证)文本出现在预期的位置。接下来的测试用例继续“asserts”(断言)第一个表的第二行第一列包含预期的值,只有当这个断言测试通过,才继续验证这一行剩余的单元格。 17 | 18 | ## verifyTextPresent 19 | 20 | 命令 verifyTextPresent 用于验证页面上是否存在指定的文本。此命令需要一个文本模式参数,用来做验证。例如: 21 | 22 | | 命令 | 目标 | 值 | 23 | | ----------- | --------------------------------- | --- | 24 | | verifyTextPresent | Marketing Analysis | | 25 | 26 | 这将导致 Selenium 去搜索,并验证文本字符串 "Marketing Analysis" 出现在被测页面的某个地方。当你只考虑页面上是否出现特定的文本时,请使用 verifyTextPresent 命令。当您还需要测试页面上文本出现的位置时,不要用这个命令。 27 | 28 | ## verifyElementPresent 29 | 30 | 用这个命令来测试特定的 UI 元素,而不是其内容,出现在页面上。这个验证不检查文本而是检查 HTML 标记。一个常见的用法是检查一个图片的存在。 31 | 32 | | 命令 | 目标 | 值 | 33 | | ----------- | ---------------------------------------- | --- | 34 | | verifyElementPresent | //div/p/img | | 35 | 36 | 这个命令验证一个图片,由 img HTML 标签指定的,是否在页面上存在,而且它在一个 div 标签和一个 p 标签下面。第一个(也是惟一一个)参数是一个定位器告诉 Selenese 命令如何找到这个元素。定位器会下一节中解释。 37 | 38 | verifyElementPresent 可以被用来检查页面中存在的任何HTML标签。您可以检查链接、段落、块等是否存在。下面是几个例子。 39 | 40 | | 命令 | 目标 | 值 | 41 | | ----------- | ---------------------------------------- | --- | 42 | | verifyElementPresent | //div/p | | 43 | | verifyElementPresent | //div/a | | 44 | | verifyElementPresent | id=Login | | 45 | | verifyElementPresent | link=Go to Marketing Research | | 46 | | verifyElementPresent | //a[2] | | 47 | | verifyElementPresent | //head/title | | 48 | 49 | 这些例子说明了UI元素可能被测试的各种方式。定位器是在下一节中解释。 50 | 51 | ## verifyText 52 | 53 | 当文本和它的UI元素都必须被测试时使用 verifyText 命令。verifyText 必须使用定位器。如果你选择 XPath 或 DOM 定位器,您可以验证在页面上特定的文本相对于其他 UI 组件出现在页面上的特定的位置。 54 | 55 | | 命令 | 目标 | 值 | 56 | | ----------- | ---------------------------------------- | --- | 57 | | verifyText | //table/tr/td/div/p | This is my text and it occurs right after the div inside the table. | 58 | -------------------------------------------------------------------------------- /2.9/BaseURL.md: -------------------------------------------------------------------------------- 1 | # 使用基址运行测试案例 2 | 3 | Selenium IDE 窗口顶部的 Base URL 字段对于测试用例运行在不同域时非常有用。假设一个名为 `http://news.portal.com` 的网站有一个名为 `http://beta.news.portal.com` 的内部测试网站。针对这些网站的任何测试用例,都是以 open 命令开始的,open 命令指定一个相对 URL 路径作为参数,而不是绝对 URL 路径(绝对路径是从一个协议,比如 http: 或 https: 开始的)。Selenium IDE 通过将 open 命令的参数追加到 Base URL 后面,来创建一个绝对的 URL 路径。例如,下面的测试用例将会运行在 `http://news.portal.com/about.html`: 4 | 5 | ![Base URL1](images/chapt3_img21_BaseURL_prod.webp) 6 | 7 | 同样的测试案例修改一下 Base URL 设置就可以运行在 `http://beta.news.portal.com/about.html`: 8 | 9 | ![Base URL2](images/chapt3_img22_BaseURL_beta.webp) 10 | -------------------------------------------------------------------------------- /2.9/Browsers.md: -------------------------------------------------------------------------------- 1 | # 跨浏览器运行 Selenium IDE 脚本 2 | 3 | 虽然 Selenium IDE 只能运行在火狐浏览器上,但是 Selenium IDE 开发的测试案例却可以运行在其他浏览器上。使用一个简单的命令行接口来调用 Selenium RC 服务器。这个话题在Selenium RC 运行 Selenese 测试部分章节有介绍。-htmlSuite 命令行选项是跟这个特定功能相关的。 4 | -------------------------------------------------------------------------------- /2.9/Build.md: -------------------------------------------------------------------------------- 1 | # 制作测试案例 2 | 3 | 开发测试案例有三个主要的方法:录制、利用上下文菜单添加验证和断言以及编辑和修改测试案例。通常自动化测试工程师应该同时掌握这三种方法。 4 | 5 | ## 录制 6 | 7 | 很多新手都是从录制一个与网站交互的测试用例,开始学习自动化测试的。当第一次打开 Selenium IDE 时,录制按钮默认是启动的。如果你不想要 Selenium IDE 自动开始录制,在系统设置中可以关掉。具体操作如下:点击 Options 菜单 > Options… 菜单项,打开系统设置对话框,取消勾选 "Start recording immediately on open." 8 | 9 | 录制期间,Selenium IDE 会根据你的操作自动在测试用例中插入命令。通常,这将包括: 10 | 11 | - 点击一个链接,click 或 clickAndWait 命令 12 | - 输入值,type 命令 13 | - 从一个下拉列表中选择选项,select 命令 14 | - 点击复选框或单选按钮,click 命令 15 | 16 | 这里有一些陷阱需要注意: 17 | 18 | - type 命令需要点击网页的某些区域的才能录制。 19 | - 链接跳转通常录制成 click 命令。你会经常需要把 click 命令改为 clickAndWait,来确保您的测试用例会暂停,直到新页面加载完成。否则,您的测试用例将在页面加载新的 UI 元素之前继续运行命令。这将会导致意想不到的测试用例运行失败。 20 | 21 | ## 通过上下文菜单添加断言和验证 22 | 23 | 测试用例通常需要检查网页的属性,这需要用到断言和验证命令。我们不会描述这些命令的细节,在 Selenium 的命令 Selenese 章节中有详细介绍。这里我们会简单地描述如何将它们添加到测试用例中。   24 | 25 | 在 Selenium IDE 录制时,在浏览器显示被测应用程序的页面上右键单击页面上的任何地方。您将看到一个上下文菜单显示验证 和/或 断言命令。 26 | 27 | 第一次使用 Selenium 时,在右键快捷菜单中 Selenium 能只列出几个命令。当你使用 IDE 一段时间后,您会发现额外的命令很快就会被添加到这个菜单上。Selenium IDE 将试图预测当前网页上您需要选择的 UI 元素会用到的命令以及参数。 28 | 29 | 让我们看看这是如何工作的。打开一个网页,选择页面上的一块文本。这个文本可以是一个段落或标题,他都会正常工作。现在,右击选中的文本,上下文菜单中应该给你一个 verifyTextPresent 命令和建议参数应该文本本身。 30 | 31 | 同时,注意到所有可用命令的菜单选项。这表明更多的命令,以及建议的参数,可以用来测试你当前选择的 UI 元素。 32 | 33 | 尝试更多的 UI 元素。右击图片,或用户控件按钮或复选框。您可能需要使用显示所有可用的命令来查看 verifyTextPresent 以外的选项。一旦你选择其他选项,更常用的将出现在一级上下文菜单。例如,为一个图片选择 verifyElementPresent 后,会导致该命令在你下一次选择一个图片并单击鼠标右键时,该命令出现在上下文菜单中。 34 | 35 | 再一次,这些命令将在 Selenium 命令章节中有详细解释。现在,请随意使用IDE来录制测试用例,从网页上右键选择命令插入到测试用例中,然后运行它。通过不断体验IDE,你可以学到很多关于 Selenium 的命令。 36 | 37 | ## 编辑 38 | 39 | ### 插入命令 40 | 41 | **表格视图** 42 | 43 | 首先,选择要插入命令的位置。在测试用例窗格中,左键单击一条命令,新插入的命令将会出现在这条命令前面。右键单击该命令并在上下文菜单中选择插入命令,IDE 将在选定的命令前面添加一个空白行。然后,在命令字段编辑域文本框中输入新命令及其参数。 44 | 45 | **源视图** 46 | 47 | 首先,选择要插入命令的位置。在测试用例窗格中,在要插入的两命令之间点击鼠标左键,输入 HTML 标记,创建一个包含三列的表格行。三列分别对应命令(第一列),第一个参数(第二列),和第二个参数(第三列)。例如: 48 | 49 | ```html 50 | 51 | Command 52 | target (locator) 53 | Value 54 | 55 | ``` 56 | 57 | ### 插入注释 58 | 59 | 注释可以添加到测试用例中,来增加测试案例的可读性。运行测试用例时,这些注释会被忽略。 60 | 61 | 通过添加空白的注释,注释还可以用来在测试案例中增加垂直方向的空白(一个或多个空行)。一个空的命令在执行时会报错,而空白注释却不会。 62 | 63 | 64 | **表格视图** 65 | 66 | 在测试用例中选择要插入注释的行。右键单击并选择插入注释。在命令字段中,输入注释。紫色的注释文本会出现在测试案例中。 67 | 68 | **源视图** 69 | 70 | 在测试用例中选择要插入注释的行。添加一个 HTML 样式的注释,例如:``。 71 | 72 | 73 | ### 编辑命令或注释 74 | 75 | **表格视图** 76 | 77 | 选择要修改或编辑的行,然后编辑命令、目标和值这三个字段。 78 | 79 | **源视图** 80 | 81 | 源视图提供了相当于一个 WYSIWYG (所见即所得)的编辑器,只需修改相应行的“命令、参数或注释即可。 82 | 83 | 84 | ## 打开和保存测试案例 85 | 86 | 与很多程序类似,Selenium IDE 的文件菜单也有保存和打开命令。然而,Selenium 对测试用例和测试套件是分别对待的。把 Selenium IDE 制作的测试案例保存下来,可以方便日后重复使用,当然,你可以选择保存成单个的测试案例或者保存成测试套件。如果测试套件中的测试用例还没有保存,Selenium IDE 会提示在保存测试套件前先保存测试案例。    87 | 88 | 当你打开一个已存在的测试案例或套件,Selenium IDE 会在测试用例面板中显示测试案例中的命令。 89 | -------------------------------------------------------------------------------- /2.9/Commonly.md: -------------------------------------------------------------------------------- 1 | # Selenium 常用命令 2 | 3 | 作为对 Selenium 的总结性介绍,我们将向您介绍几个常用的 Selenium 命令。这些是构建测试中最常用的命令。 4 | 5 | **open** 6 | 使用 URL 打开一个页面. 7 | 8 | **click/clickAndWait** 9 | 执行点击操作或者等待新页面加载完成后执行点击操作。 10 | 11 | **verifyTitle/assertTitle** 12 | 检查页面的标题是否为预期的内容。 13 | 14 | **verifyTextPresent** 15 | 检查页面上某处的文字是否为预期的内容。 16 | 17 | **verifyElementPresent** 18 | 验证用 HTML 标签定义的,预期的 UI 元素,在页面上是否存在。 19 | 20 | **verifyText** 21 | 验证预期的文本和其相应的 HTML 标记是否出现在页面上。 22 | 23 | **verifyTable** 24 | 验证表格是否包含预期的内容。 25 | 26 | **waitForPageToLoad** 27 | 暂停执行,直到预期的新页面成功加载。当使用 clickAndWait 命令时,此命令自动被调用。 28 | 29 | **waitForElementPresent** 30 | 在一个 HTML 标签定义的 UI 元素,在页面上出现前,暂停执行脚本,直到该UI 元素出现为止。 31 | -------------------------------------------------------------------------------- /2.9/DDT.md: -------------------------------------------------------------------------------- 1 | <待续> 2 | -------------------------------------------------------------------------------- /2.9/Database.md: -------------------------------------------------------------------------------- 1 | <待续> 2 | -------------------------------------------------------------------------------- /2.9/Debugging.md: -------------------------------------------------------------------------------- 1 | # 调试脚本 2 | 3 | 调试是发现错误和修复错误,是测试案例开发过程中的常见动作。 4 | 5 | 这里不打算介绍如何调试,很多 Selenium 的新手也已经具备基本的调试经验。如果调试对于你是全新的领域,建议你向公司里的开发人员请教。 6 | 7 | ## 断点和起点 8 | 9 | Selenium IDE 通过设置断点可以让运行中的测试脚本在断点处暂停执行或者继续执行。通过断点,你可以让自动化脚本运行在特定的命令处暂停,可以观察该脚本在这个点上的行为。要做到这一点,需要在待观察的命令前一条命令处设置断点。 10 | 11 | 设置一个断点,需要在表格视图选择一条命令,单击鼠标右键,从上下文菜单中选择“Toggle Breakpoint”。然后点击运行按钮,运行脚本,脚本将会从第一个测试案例脚本的第一行一直运行到断点处。 12 | 13 | 有些时候需要从测试案例脚本的中间某行开始运行,一直运行到最后一行。或者从测试案例脚本的中间某行开始运行,一直运行到断点处。这个时候设置起始点就很有用处了。举一个常见的例子,假设你的测试案例需要先登录网站,然后执行一系列测试。现在你需要对登录后的测试案例进行调试,通过在登录测试脚本之后设置起始点,这样你调试脚本的时候,就不用每次都从登录开始执行测试案例,因为,你在登录之前势必要先退出登录,这就省去每次退出登录了。 14 | 15 | 设置一个起始点,先选中一个命令,在该命令上点击鼠标右键,在上下文菜单中选择“Set/Clear Start Point”。然后点击运行按钮,测试案例从起始点开始运行了。 16 | 17 | ## 单步执行 18 | 19 | 通过下面的步骤和方法,可以一次执行测试案例的一个命令,也就是所谓的单步执行: 20 | 21 | 1. 通过工具栏的启动按钮,启动测试脚本的执行; 22 | ![](images/chapt3_img09_Run.webp) 23 | 24 | 2. 通过工具栏的暂停按钮,快速暂停测试脚本的执行; 25 | ![](images/chapt3_img10_Pause.webp) 26 | 27 | 3. 重复的点击单步执行按钮,点击一次,执行一个测试脚本中的命令。 28 | ![](images/chapt3_img12_Step.webp) 29 | 30 | ## Find按钮 31 | 32 | “Find” 按钮用来查看当前选中的 Selenium 命令所操作的 web 页面上的 UI 元素。对于一个命令,如果第一个参数是定位器,这个工具用来验证定位器是否正确很有用。这个按钮可以用在所有需要操作 UI 界面元素的命令上,例如:click, clickAndWait, 以及相应的断言和验证命令。 33 | 34 | 从表格视图上,选择带有定位器参数的一个命令,点击 “Find” 按钮,现在观察页面。在定位器所标识的页面元素周围有一个绿色的方框包围。 35 | 36 | ## 页面源代码 37 | 38 | 在调试测试脚本时,经常需要查看被测网页的源代码来定位问题。火狐浏览器查看网页源代码非常容易。只要在被测网页上点击鼠标右键选择“查看网页源代码”,网页源代码会显示在另外一个窗口中,使用查找功能可以找到 HTML 代码中的指定 UI 元素的信息。 39 | 40 | 另一种方式,选择网页上感兴趣的部分元素,点击鼠标右键选择“查看选中部分源代码”,火狐浏览器打开一个新窗口,只有一部分网页 HTML 代码显示出来,其中选中部分 UI 界面元素的网页 HTML 代码被高亮显示出来了。 41 | 42 | ## 辅助定位 43 | 44 | 当 Selenium IDE 录制一个有定位类型参数的命令时,他会存储一些额外的定位信息,允许用户去替换选择可能的定位参数。此功能有利于我们学习掌握更多关于定位器的知识,并且经常可以用来辅助修改录制好的测试脚本。 45 | 46 | 这个定位器辅助工具在 Selenium IDE 窗口上命令字段下面的 Target(目标)字段的右边,是一个下拉列表。只有当 Target(目标)字段录制的时候是定位器时,这个辅助工具才会生效。 47 | 48 | ![](images/chapt3_img23_IDE_Locator_Assistance.webp) 49 | -------------------------------------------------------------------------------- /2.9/Extensions.md: -------------------------------------------------------------------------------- 1 | # 用户自定义扩展 2 | 3 | 用户自定义扩展是用户自己创建的 JavaScript 文件,对 Selenium IDE 现有的功能进行定制以及功能扩展。通常这种定制和扩展是以自定义命令的形式来体现的,当然也不仅限于命令。 4 | 5 | [这里](http://wiki.openqa.org/display/SEL/Contributed+User-Extensions)可以找到很多有用的扩展。 6 | 7 | *注意:这部分信息已经过时,我们将很快修改。* 8 | 9 | 也许最受欢迎的 Selenium IDE 扩展就是流程控制,流程控制扩展将提供 while 循环和条件判断。这个扩展是 [goto_sel_ide.js](http://wiki.openqa.org/download/attachments/379/goto_sel_ide.js)。如何使用这个扩展所提供的功能,看看作者创建的[页面](http://51elliot.blogspot.com/2008/02/selenium-ide-goto.html)。 10 | 11 | 安装这个扩展的步骤为,在 Selenium-IDE 的 Options 菜单 => Options 子菜单项 => General 选项卡下,把 goto_sel_ide.js 在计算机上的路径信息填到 Selenium Core extensions 字段中,即可。 12 | 13 | ![](images/chapt3_img32_Extensions_install.webp) 14 | 15 | 点选 OK 按钮后,需要关闭并重启 Selenium IDE,以保证扩展文件被载入。对扩展文件的任何修改都需要关闭并重新打开 Selenium-IDE。 16 | 17 | 关于如何编写用户自定义扩展,请查看 [Selenium 参考文档](http://release.openqa.org/selenium-core/1.0/reference.html)。 18 | 19 | 经验证有时单步调试对于 Selenium IDE 和用户自定义扩展是很有用的。基于 XUL/Chrome 唯一能够进行调试的扩展是 Venkman,这个扩展直到 Firefox 32 版本才支持。经验证在 Firefox 32 和 Selenium IDE 2.9.0 中已经支持单步调试。 20 | -------------------------------------------------------------------------------- /2.9/Features.md: -------------------------------------------------------------------------------- 1 | # IDE 的功能 2 | 3 | ## 菜单栏 4 | 5 | 文件菜单用来管理测试用例和测试套件(一组测试案例)。通过文件菜单可以添加一个新的测试用例,打开测试用例,保存测试用例,将测试用例导出成某种编程语言的代码文件。打开最近的测试用例。所有这些操作也适用于测试套件。 6 | 7 | 编辑菜单允许对测试用例中被选择的命令进行复制、粘贴、删除、取消,等操作。Options 菜单允许改变设置。你可以设置某些命令的超时值,添加用户自定义扩展来扩展 Selenium 的基本命令,指定保存测试用例所适用的格式(即:编程语言)。帮助菜单是火狐浏览器的标准菜单。 8 | 9 | ## 工具栏 10 | 11 | 工具栏上的按钮用来控制测试用例的执行,包括:单步执行的功能用来调试测试用例。最右边的一个红点按钮,是录制测试脚本的。 12 | 13 | ![](images/chapt3_img06_IDE_features.webp) 14 | 15 | ![](images/chapt3_img07_Speed_Control.webp) 16 | 速度控制:控制测试用例运行的速度。 17 | 18 | ![](images/chapt3_img08_Run_All.webp) 19 | 全部运行:运行整个测试套件,当一个测试套件中加载了多个测试用例时。 20 | 21 | ![](images/chapt3_img09_Run.webp) 22 | 运行:运行当前选中的测试。当只加载了一个测试用例时,这个按钮和全部运行按钮效果相同。 23 | 24 | ![](images/chapt3_img10_Pause.webp) ![](images/cchapt3_img11_Resume.webp) 25 | 暂停/继续:允许停止和重新启动运行测试用例。 26 | 27 | ![](images/chapt3_img12_Step.webp) 28 | 单步执行:允许你单步执行测试用例,即,一次运行测试用例中的一个命令。用于调试的测试用例。 29 | 30 | ![](images/chapt3_img13_TestRunner_Mode.webp) 31 | 测试运行模式:这种高级特性允许将一系列的Selenium命令组合成一个单一动作来重复执行。Rollup rules的详细文档在帮助菜单的UI-Element中查看。 32 | 33 | ![](images/chapt3_img14_Apply_Rollup_Rules.webp) 34 | 应用回滚规则:这个高级功能允许一组 Selenium 命令作为一个动作来执行。关于回滚规则的详细文档,请参考帮助菜单的 UI-元素 文档。 35 | 36 | ![](images/chapt3_img15_Record.webp) 37 | 录制:录制用户在浏览器中的操作。 38 | 39 | 40 | ## 测试用例面板 41 | 42 | 自动化测试脚本显示在测试用例面板中。它有两个选项卡,一个是表格选项卡,以容易阅读的表格形式来显示命令和参数。 43 | 44 | ![](images/chapt3_img16_Table_Format.webp) 45 | 46 | 另一个是源选项卡,显示存储测试用例文件的原生格式。默认情况下,测试用例的原生文件格式是 HTML,当然可以改变成其他编程语言,如 Java 或 C#,或像 Python 这样的脚本语言。有关详细信息,请参阅 Options 菜单。源视图允许在原代码状态对测试用例进行编辑,包括复制、剪切和粘贴操作。 47 | 48 | Command(命令),Target(目标)和 Value(值),三个字段用来显示当前选中命令及其参数。你可以很方便的修改当前选中命令的这三个参数。窗口下方的参考面板中会显示选中命令的完整参考信息,一般来说命令的第一个参数通常都是目标字段。如果在参考面板中显示的命令有第二个参数,则它通常都是值字段。 49 | 50 | ![](images/chapt3_img17_Entry_Fields.webp) 51 | 52 | 如果你开始在命令字段键入命令,根据你键入的字符,会出现一个待选的命令下拉列表,您可以从中选择您想要命令。 53 | 54 | 55 | ## 日志/参考/UI元素/回滚 窗格 56 | 57 | 底部窗格有四个不同的选项卡,分别是:Log(日志),Reference(参考),UI-Element(UI元素)和 Rollup(回滚)。到底显示哪个窗格,取决于被点选的选项卡是哪个。 58 | 59 | ### 日志窗格 60 | 61 | 运行测试用例时,即使你不首先选择日志选项卡,错误消息和正常消息随着测试案例的执行信息会自动显示在此窗格。这些信息通常用于调试测试用例。注意 Clear 按钮用来清除日志。还有 Info 按钮下拉列表允许你选择不同级别的日志信息。 62 | 63 | ![](images/chapt3_img18_Bottom_Box.webp) 64 | 65 | ### 参考窗格 66 | 67 | 当我们在表格视图下,输入或修改 Selenese 命令或参数时,默认会切换到参考选项卡。在表格视图中,参考面板将显示当前命令的文档。无论在表视图还是在源视图中,当我们输入或修改命令时,确保命令参数中的目标和值字段与参考面板中提示的参数列表信息相匹配,这是至关重要的。参数的数量必须匹配,参数的顺序必须匹配,而且参数的类型必须匹配。如果上述三个方面有任何不匹配之处,命令将不能正确执行。 68 | 69 | ![](images/chapt3_img19_Bottom_Box_Ref.webp) 70 | 71 | ### UI-元素和回滚窗格 72 | 73 | 这两个窗格的详细信息(这涉及到高级功能)请在 Selenium IDE 的帮助菜单的 UI-元素 文档中查看。 74 | -------------------------------------------------------------------------------- /2.9/Flow.md: -------------------------------------------------------------------------------- 1 | # 顺序执行和流程控制 2 | 3 | 脚本是一个命令一个命令顺序执行的。 4 | 5 | Selenese 本身不支持条件语句(if - else, 等)或循环迭代(for, while, 等)。没有流程控制也可以制作很多有用的测试案例。然而,对于动态内容的功能测试,可能涉及到多个页面,编程逻辑通常是必要的。 6 | 7 | 如果必须使用流程控制,有以下三种解决方案: 8 | 9 | 1. 使用 Selenium RC 运行脚本结合客户端库,如:Java 或 PHP 库,利用编程语言的流程控制功能。 10 | 2. 用 storeEval 命令从脚本中运行一个小的 JavaScript 代码片段。 11 | 3. 安装 [goto_sel_ide.js](http://www.seleniumhq.org/docs/02_selenium_ide.jsp#goto-sel-ide-js-extension) 扩展。 12 | 13 | 很多测试人员将测试脚本导出成一个编程语言的代码文件,结合 Selenium RC API 一起使用(参见Selenium IDE 章)。然而,有些组织更倾向于尽可能地用 Selenium IDE 运行测试脚本(例如,当他们有初级测试工程师,或当编程技能缺乏)。如果是这种情况,请考虑 JavaScript 代码片段或 goto_sel_ide.js 扩展。 14 | -------------------------------------------------------------------------------- /2.9/Format.md: -------------------------------------------------------------------------------- 1 | # 格式化 2 | 3 | 在 Options 菜单下,Format 子菜单,可以选择用来保存和显示测试案例所使用的编程语言。默认格式是 HTML。 4 | 5 | 如果使用 Selenium RC 来运行测试用例,这个功能用于将测试用例转化为一种编程语言。首先,选择一种编程语言,例如 Java、PHP,该编程语言将结合 Selenium RC 来开发测试程序。然后,使用“文件”=>“Export Test Case As”来保存测试案例。测试用例将根据你选择的语言转化为一系列的函数。Selenium IDE 可以生成基础的程序代码来支持后续的测试。 6 | 7 | 同时,注意,如果生成的代码不符合你的需要,你可以通过通过修改配置文件来改变它,配置文件中定义了程序代码的生成过程。每个受支持的语言都有可编辑的配置设置。在 Options => Options => Formats 选项卡下。 8 | 9 | **注意** 10 | 11 | 新版本的 Selenium IDE 已经不支持这个菜单项了。但是导出代码的功能还是保留的。 12 | -------------------------------------------------------------------------------- /2.9/Install.md: -------------------------------------------------------------------------------- 1 | # 安装 Selenium IDE 2 | 3 | 首先,用火狐浏览器从 SeleniumHQ [下载页面](http://seleniumhq.org/download/)下载 IDE。 4 | 5 | 出于保护的目的,火狐浏览器会阻止你从不熟悉的地点安装插件,你需要点击“Allow”来继续安装,如下图所示。 6 | ![](./images/chapt3_img01_IDE_Installation.webp) 7 | 8 | 当火狐浏览器下载插件的时候,会出现下面的窗口。 9 | ![](./images/chapt3_img02_IDE_Installation.webp) 10 | 11 | 点击“Install Now”。火狐浏览器会弹出组件管理窗口,首先显示一个进度条,然后下载结束,如下图所示。 12 | ![](./images/chapt3_img03_IDE_Installation.webp) 13 | 14 | 重启火狐浏览器,然后你会在浏览器的工具菜单下面找到刚安装好的 Selenium IDE 。 15 | ![](./images/chapt3_img04_IDE_Installation.webp) 16 | -------------------------------------------------------------------------------- /2.9/Introduction.md: -------------------------------------------------------------------------------- 1 | # 简介 2 | 3 | Selenium IDE(Integrated Development Environment,集成开发环境)是用来开发 Selenium 测试用例的工具。它是一个易于使用的火狐浏览器插件,通常是开发测试用例最有效的方法。它还包含一个上下文菜单,允许你首先从浏览器当前显示的页面中选择一个 UI 元素,然后从 Selenium 的命令列表中选择命令,依据网页中选择的 UI 元素的上下文使用预定义的参数。这不仅节省时间,而且是学习 Selenium 脚本语法的一个好方法。 4 | 5 | 这个章节专门介绍 Selenium IDE ,以及如何高效使用这个工具。 6 | -------------------------------------------------------------------------------- /2.9/JavaScript.md: -------------------------------------------------------------------------------- 1 | # JavaScript 和 Selenese 变量参数 2 | 3 | JavaScript 可以用于两种类型的 Selenese 参数:脚本参数和非脚本参数(通常是表达式参数)。很多情况下,你可能需要访问或操作 Selenese 参数中的JavaScript 代码片段中的变量。测试用例中的所有变量被存储在 JavaScript 关联数组中。关联数组用字符串来索引而不是用连续的数字索引。存放测试案例变量的关联数组的变量名是 storedVars。当你想在 JavaScript 代码片段中访问或操作变量时,你需要通过 storedVars['yourVariableName'] 来访问。 4 | 5 | ## 使用 JavaScript 脚本参数 6 | 7 | 有些 Selenese 命令会指定 script 脚本参数,包括 assertEval, verifyEval, storeEval, waitForEval。这些参数没有需要特殊的语法要求。Selenium IDE 用户只需放置一个 JavaScript 代码片段的到适当的字段,通常是 Target 目标字段(因为脚本参数通常是第一或唯一的参数)。 8 | 9 | 下面的例子说明了如何使用 JavaScript 代码片段来执行一个简单的数值计算: 10 | 11 | | 命令 | 目标 | 值 | 12 | | ----------- | ---------------------------------------- | --- | 13 | | store | Edith Wharton | name | 14 | | storeEval | storedVars[‘name’].toUpperCase() | uc | 15 | | storeEval | storedVars[‘name’].toLowerCase() | lc | 16 | 17 | 下一个示例演示了如何在 JavaScript 代码片段中调用方法,示例代码中,JavaScript 字符串对象调用了 toUpperCase 方法和 toLowerCase 方法。 18 | 19 | ## 使用非脚本参数 20 | 21 | JavaScript 脚本还可以用于生成参数的值,即使没有指定参数是 script 脚本类型。在这种情况下,通过使用特殊的语法,即整个参数值由 javascript 做前缀,在花括号中放置代码片段,例如:javascript { * 这里是你的代码 * }。下面的例子中在 type 命令的第二个 value 值参数中通过 JavaScript 代码使用这个特殊语法产生参数值: 22 | 23 | | 命令 | 目标 | 值 | 24 | | ----------- | ---------------------------------------- | --- | 25 | | store | league of nations | searchString | 26 | | type | q | javascript{storedVars[‘searchString’].toUpperCase()} | 27 | -------------------------------------------------------------------------------- /2.9/Locating.md: -------------------------------------------------------------------------------- 1 | # 定位元素 2 | 3 | 对于许多 Selenium 命令,目标是必需的。这个目标用来标示 web 应用程序内容中的指定元素,他是用 locatorType = location 格式所描述。在许多情况下定位器类型可以省略。下面逐一解释各种定位器类型的例子。 4 | 5 | ## 标示符定位 6 | 7 | 这是最常用的定位元素的方法,当没有指定定位器类型时,默认使用这种定位器。这个策略会检索 id 属性值与 location 匹配的第一个元素。如果没有元素的 id 属性与之匹配,那么会检索 name 属性与 location 匹配的第一个元素。 8 | 9 | 例如,你的页面源代码可能有id和name属性如下: 10 | 11 | ```html 12 | 13 | 14 |
15 | 16 | 17 | 18 |
19 | 20 | 21 | ``` 22 | 下面的定位策略将返回上面 HTML片段 中相匹配元素的行号: 23 | 24 | - identifier=loginForm (3) 25 | - identifier=password (5) 26 | - identifier=continue (6) 27 | - continue (6) 28 | 29 | 因为 identifier 类型的定位是默认的,前三个例子的 identifier = 不是必需的。 30 | 31 | ## ID 定位 32 | 33 | 这种类型的定位器比 identifier 定位器类型限制更多,但也更加明确。当你知道一个元素的 id 属性时使用这个定位器。 34 | 35 | ```html 36 | 37 | 38 |
39 | 40 | 41 | 42 | 43 |
44 | 45 | 46 | ``` 47 | 48 | - id=loginForm (3) 49 | 50 | ## Name 定位 51 | 52 | Name 定位器类型将定位与 Name 属性相匹配的第一个元素。如果有多个名称属性相同的元素,那么您可以使用过滤器来进一步完善你的位置策略。默认的过滤器类型是值(匹配 value 属性)。 53 | 54 | ```html 55 | 56 | 57 |
58 | 59 | 60 | 61 | 62 |
63 | 64 | 65 | ``` 66 | 67 | - name=username (4) 68 | - name=continue value=Clear (7) 69 | - name=continue Clear (7) 70 | - name=continue type=button (7) 71 | 72 | **注意** 73 | 74 | 不像某些类型的定位器,如:XPath 和 DOM。上面三种类型的定位器允许 Selenium 测试 UI 元素不依赖与在页面上的位置。如果页面结构或者组织改变了,测试仍将通过。你可能会或可能不会对页面结构发生变化的页面进行测试。如果网页设计师经常改变页面,但其功能必须回归测试,通过 id 和 name 属性,或通过任何 HTML 属性进行测试就变得非常重要了。 75 | 76 | ## XPath 定位 77 | 78 | XPath 是用于定位 XML 文档中节点的语言。由于 HTML 可以实现为 XML(XHTML),Selenium 的用户可以利用这个强大的语言来定位他们 web 应用程序中的元素。XPath 超出(以及支持)简单的 id 或 name 属性定位,并开辟了各种新的可能性,如定位页面上第三方的复选框。 79 | 80 | 使用 XPath 的主要原因之一是对于一个你希望找到的元素,你没有合适的 id 或 name 属性来定位。您可以用 XPath 绝对定位元素(不建议),或相对于一个有 id 或 name 属性的元素来定位。XPath 定位器也可以通过使用 id 和 name 属性之外的其他属性来定位元素。 81 | 82 | 绝对的 XPath 包含从根(html)所有元素的位置,因此只要轻微的调整应用程序页面,XPath 就会失效。通过寻找附近的 id 或 name 属性的元素(理想情况下是一个父元素)可以基于这种位置关系来定位你的目标元素。这种位置关系通常不太可能改变,可以使你的测试更加健壮。 83 | 84 | 因为只有 XPath 定位器从 // 开始,所以在指定 XPath 定位器时没有必要包含 xpath = label。 85 | 86 | ```html 87 | 88 | 89 |
90 | 91 | 92 | 93 | 94 |
95 | 96 | 97 | ``` 98 | 99 | - xpath=/html/body/form[1] (3) - 绝对路径(对 HTML 轻微的修改会令此路径失效) 100 | - //form[1] (3) - HTML中的第一个form 元素 101 | - xpath = //form[@id = 'loginForm'] (3) - 拥有 id 属性值为 loginForm 的 element 元素 102 | - xpath=//form[input/@name='username'] (3) - 拥有一个 input 子元素,该元素的 name 属性值为 username 的第一个表单元素 103 | - //input[@name='username'] (4) - name 属性值为 username 的第一个 input 元素 104 | - //form[@id='loginForm']/input[1] (4) - id 为 loginForm 的表单元素的第一个 input 子元素 105 | - //input[@name='continue'][@type='button'] (7) - name 属性值为 continue 以及 type 属性值为 button 的 input 元素 106 | - //form[@id='loginForm']/input[4] (7) - id 属性值为 loginForm 的表单的第四个 input 子元素 107 | 108 | 上面的例子都很基础,如果想更深入的学习,请参考下面的学习资料: 109 | 110 | - [W3Schools XPath Tutorial](http://www.w3schools.com/Xpath/) 111 | - [W3C XPath Recommendation](http://www.w3schools.com/Xpath/) 112 | 113 | 下面是一些非常有用的火狐浏览器的插件,能辅助定位 XPath 中的元素: 114 | 115 | - [XPath Checker](https://addons.mozilla.org/en-US/firefox/addon/1095?id=1095) - 生成 XPath 并检查 XPath 的有效性 116 | - [Firebug](https://addons.mozilla.org/en-US/firefox/addon/1843) - 非常强大而有用的插件, XPath 只是其中很小的功能 117 | 118 | 119 | ## Link Text 定位超链接 120 | 121 | 用链接文字来定位网页面上的超链接元素是一个很简单的方法。如果两个链接有相同的文本,那么第一个匹配的元素被定位。 122 | 123 | ```html 124 | 125 | 126 |

Are you sure you want to do this?

127 | Continue 128 | Cancel 129 | 130 | 131 | ``` 132 | 133 | - link=Continue (4) 134 | - link=Cancel (5) 135 | 136 | ## DOM 定位 137 | 138 | 文档对象模型用来表示一个 HTML 文档,可以使用 JavaScript 操作和访问。这个位置策略使用 JavaScript 来评估一个元素是否页面上,他通过使用分层的点号标记法,使得元素定位得到简化。 139 | 140 | 因为只有 dom 定位器由 document 开始,所以当指定一个 DOM 定位器时没有必要包括 dom = label 。 141 | 142 | ```html 143 | 144 | 145 |
146 | 147 | 148 | 149 | 150 |
151 | 152 | 153 | ``` 154 | 155 | - dom=document.getElementById('loginForm') (3) 156 | - dom=document.forms['loginForm'] (3) 157 | - dom=document.forms[0] (3) 158 | - document.forms[0].username (4) 159 | - document.forms[0].elements['username'] (4) 160 | - document.forms[0].elements[0] (4) 161 | - document.forms[0].elements[3] (7) 162 | 163 | 您可以使用 Selenium 以及其他网站或者浏览器扩展来探索你的 web 应用程序的 DOM。W3Schools 是一个好的参考。 164 | 165 | ## CSS 定位 166 | 167 | CSS(Cascading Style Sheets,层叠样式表)是用于描述 HTML 和 XML 文档样式的语言。CSS 使用选择器来绑定文档中元素的样式属性。这些选择器可以使用 Selenium 作为另一个定位策略。 168 | 169 | ```html 170 | 171 | 172 |
173 | 174 | 175 | 176 | 177 |
178 | 179 | 180 | ``` 181 | 182 | - css=form#loginForm (3) 183 | - css=input[name="username"] (4) 184 | - css=input.required[type="text"] (4) 185 | - css=input.passfield (5) 186 | - css=#loginForm input[type="button"] (7) 187 | - css=#loginForm input:nth-child(2) (5) 188 | 189 | 关于 CSS 选择器的更多信息,请参考 W3C publication。你会在那里找到额外的资料。 190 | 191 | **注意** 192 | 193 | 经验丰富的 Selenium 用户推荐 CSS 作为他们的定位策略,因为 CSS 选择器速度大大快于 XPath 并且可以在一个 HTML 文档中找到最复杂的对象。 194 | 195 | ## 隐式定位器 196 | 197 | 以下三种情况你可以省略定位器类型: 198 | 199 | - 定位器没有明确指定定位策略的默认使用identifier 定位策略。 200 | - 定位器开始与 // 将使用XPath定位策略。 201 | - 定位器开始于 document 将使用DOM定位策略。 202 | -------------------------------------------------------------------------------- /2.9/LocationStrategies.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangding/selenium-ide-doc/e881bbaa55fc876267f95614c5f7ec29661ca11e/2.9/LocationStrategies.md -------------------------------------------------------------------------------- /2.9/Mapping.md: -------------------------------------------------------------------------------- 1 | <待续> 2 | -------------------------------------------------------------------------------- /2.9/Open.md: -------------------------------------------------------------------------------- 1 | # 启动 Selenium IDE 2 | 3 | 启动 Selenium IDE 非常容易,只要点击火狐浏览器的工具菜单,在工具菜单或者工具菜单下的 web 开发者子菜单下找到 Selenium IDE 菜单项,点击即可。Selenium IDE 启动之后,会显示一个空白脚本编辑的窗口,窗口上有菜单栏,可以创建新的测试用例。 4 | 5 | ![Selenium IDE 窗口截图](images/chapt3_img05_IDE_open.webp) 6 | -------------------------------------------------------------------------------- /2.9/Page.md: -------------------------------------------------------------------------------- 1 | <待续> 2 | -------------------------------------------------------------------------------- /2.9/Patterns.md: -------------------------------------------------------------------------------- 1 | # 匹配文本模式 2 | 3 | 类似定位器参数,文本模式是另一种常用的 Selenium 命令参数。需要使用文本模式的命令,例如:verifyTextPresent, verifyTitle, verifyAlert, assertConfirmation, verifyText, verifyPrompt。上面已经提到,LinkText 定位器可使用文本模式。文本模式使用特殊字符来模糊匹配预期的文本,而不必准确的描述该文本。 4 | 5 | 有三种类型的模式:Globbing 模式,正则表达式和 exact。 6 | 7 | ## Globbing 模式 8 | 9 | 很人都熟悉 globbing ,因为在 DOS 或 Unix / Linux 命令行下经常用 globbing 模式来匹配文件名,如: ls *.c。这个例子中,globbing 模式用于匹配当前目录下所有的 .c 扩展名的文件。Globbing 的功能很有限。Selenium 只支持和实现两个特殊字符: 10 | 11 | - \* 匹配任何事情,例如:什么也没有,一个字符,或许多字符。 12 | - \[ \](字符类)匹配方括号中的任何单个字符。一个连字符指定一定范围的字符(通常是连续的 ASCII 字符集)。下面几个例子将演示字符类的用法: 13 | 14 | - [aeiou] 匹配任何一个小写的元音字母 15 | - [0 - 9] 匹配任何数字 16 | - [a-zA-Z0-9] 匹配任何字母和数字符号 17 | 18 | 在很多其他系统中,globbing 还包括第三个特殊字符问号 “?”。然而,Selenium globbing 模式只支持星号和字符类。 19 | 20 | 在一个 Selenese 命令中,你可以用 glob: 标记来声明,指定使用 globbing 文本模式参数。然而,由于 globbing 文本模式是默认的,所以你也可以省略 glob: 标签而只保留文本模式本身。 21 | 22 | 下面例子中,有两个命令使用 globbing 文本模式。在页面上实际的链接文本是 “Film/Television Department”,使用了文本模式而不是准确的文本,click 命令将继续工作,即使链接文本改为“Film & Television Department” 或 “Film and Television Department”。glob 文本模式的星号会匹配 “Film” 单词和 “Television”单词中间的任何符号或者没有符号。 23 | 24 | | 命令 | 目标 | 值 | 25 | | ------------- | ------------------------------------------- | ------------ | 26 | | click | link=glob:Film\*Television Department | | 27 | | verifyTitle | glob:\*Film\*Television\* | | 28 | 29 | 点击链接所打开页面的实际标题是 “De Anza Film And Television Department - Menu”。通过使用文本模式而不是准确的文本,只要页面标题中的任何地方前后出现 “Film” 和 “Television” 这两个单词,则 verifyTitle 将验证通过。例如,如果网页作者缩短标题为 “Film & Television Department”,测试会通过。在链接文本或者普通文本中使用文本模式将会大大减小测试案例的维护成本。 30 | 31 | ## 正则表达式文本模式 32 | 33 | 正则表达式文本模式在 Selenese 支持的三种文本模式中是功能最强大的。很多高级编程语言、很多文本编辑器以及很多工具中都支持正则表达式。包括 Linux / Unix 命令行实用工具 grep、sed 和 awk。在 Selenese 中,正则表达式文本模式允许用户执行许多非常困难的任务。例如,假设测试需要确保一个特定表单元中只包含一个数字。regexp: [0 - 9]+ 这个简单的文本模式,它将匹配任何长度的十进制数。 34 | 35 | 而 Selenese globbing 文本模式只支持通配符\*和[ ](字符类)功能,Selenese 正则表达式文本模式提供存在于 JavaScript 中的相同广泛的特殊字符。下面是一个特殊字符的子集: 36 | 37 | | 模式 | 匹配 | 38 | | -------- | ------------------------ | 39 | | . | 任何单个字符 | 40 | | [ ] | 字符类:出现在方括号中的任意单个字符 | 41 | | \* | 数量:0 个或多个前面的字符(或者组) | 42 | | + | 数量:1 个或多个前面的字符(或者组) | 43 | | ? | 数量:0 个或 1 个前面的字符(或者组) | 44 | | {1,5} | 数量:1 至 5 个 前面的字符(或者组) | 45 | | | | 交替:竖道左边的字符/组或者右边的字符/组 | 46 | | ( ) | 组:经常用在 and/or 替换的量 | 47 | 48 | 正则表达式文本模式在 Selenese 命令参数中需要用 regexp: 或 regexpi: 前缀。前者是大小写敏感的,后者是不区分大小写的。 49 | 50 | 下面几个例子将帮助阐明如何使用正则表达式模式与 Selenese 命令。第一个例子是正则表达式最常用的方式 .\* (点星)。这两个字符序列可以表示 0 或出现任何字符或者更简单,任何字符或没有字符。它相当于 globbing 模式中的一个 * (星号)。 51 | 52 | | 命令 | 目标 | 值 | 53 | | ----------- | ---------------------------------------- | --- | 54 | | click | link=regexp:Film.\*Television Department | | 55 | | verifyTitle | regexp:.\*Film.\*Television.\* | | 56 | 57 | 上面的例子与前面使用 globbing 字符模式例子的功能相同。唯一的区别是前缀(regexp: 代替了 glob:)任何字符或没有字符模式(.* 代替了 *)。 58 | 59 | 下面例子稍微复杂一些,测试 Anchorage Alaska 地区的 Yahoo! 天气页面中的日出时间: 60 | 61 | | 命令 | 目标 | 值 | 62 | | ----------------- | ------------------------------------------------ | --- | 63 | | open | http://weather.yahoo.com/forecast/USAK0012.html | | 64 | | verifyTextPresent | regexp:Sunrise: *[0-9]{1,2}:[0-9]{2} [ap]m | | 65 | 66 | 下面将逐一解释上面的正则表达式: 67 | 68 | | Sunrise: \*| Sunrise: 字符串跟着 0 个或多个空格 | 69 | | ----------- | --------------------------- | 70 | | [0-9]{1,2} | 1 或 2 位数字(表示小时) | 71 | | : | 字符 : 小时和分钟中间的分割字符 | 72 | | [0-9]{1,2} | 2 位数字(表示分钟)后面跟一个空格 | 73 | | [ap]m | a 或者 p 后面跟着 m 字符,表示 ap 或者 pm | 74 | 75 | ## Exact 文本模式 76 | 77 | Selenium 的 exact 文本模式只有非常少的使用场合。这种文本模式没有什么特殊字符,所以顾名思义称为准确模式。所以,当你需要匹配一个包含星号的文本时,globbing 和正则表达式都是用星号作为特殊字符,这时 exact 文本模式就派上用场了。例如,你想在下拉列表中选择 “Real *” 选项,下面的代码可能有效或者无效。glob:Real * 文本模式将匹配 Real 开头的任何字符串。这样,如果这个选项前面有一个选项文本为 “Real Numbers”,这个选项将匹配成功,而不是 “Real *”。 78 | 79 | | select | //select | glob:Real * | 80 | | ------- | --------- | ------------- | 81 | 82 | 为了确保 "Real *" 选项被选择,exact: 前缀的 exact 文本模式如下所示: 83 | 84 | | select | //select | exact:Real * | 85 | | ------- | --------- | -------------- | 86 | 87 | 实际上正则表达式文本模式通过转义星号可以实现同样的效果: 88 | 89 | | select | //select | regexp:Real \\* | 90 | | ------- | ----------- | ---------------- | 91 | 92 | 测试人员平时很少需要匹配带星号或方括号(globbing 模式的字符类)的文本。因此,globbing 文本模式和正则表达式文本模式能解决绝大多数的字符匹配的问题。 93 | -------------------------------------------------------------------------------- /2.9/README.md: -------------------------------------------------------------------------------- 1 | # 简介 2 | 3 | Selenium IDE 是一款 web UI 自动化测试工具,是基于录制和回放操作的火狐浏览器的插件。本教程是官方资料的翻译。 4 | 5 | 如果不喜欢阅读文字教程,可以尝试学习 [Selenium IDE web 自动化测试视频课程](https://github.com/wangding/courses/blob/master/seleniumIDE/README.md),并完成相应的通关任务。 6 | 7 | -------------------------------------------------------------------------------- /2.9/Run.md: -------------------------------------------------------------------------------- 1 | # 运行测试案例 2 | 3 | Selenium IDE 有很多不同的方式来运行测试案例。你可以一次完整的运行整个测试案例,或者暂停运行并继续运行,或者一次执行一行,或者执行正在开发的这个命令,或者通过测试套件批量运行若干测试案例。在 Selenium IDE 中运行测试案例非常灵活和方便。 4 | 5 | **运行一个测试案例** 6 | 单击运行按钮,可以运行当前显示的测试用例。 7 | 8 | **运行一个测试套件** 9 | 单击运行全部按钮,可以运行当前加载的测试套件中的所有测试案例。 10 | 11 | **暂停和开始** 12 | 暂停按钮可以用来中止运行中的测试案例。随后,这个按钮的图标会变成继续执行。点击此按钮,测试案例将继续执行。 13 | 14 | **运行中暂停** 15 | 可以在测试案例中设置一个断点,测试案例会在断点命令处暂停执行。这个功能在调试时非常有用。设置断点的方法是,在需要中断的命令上,单击鼠标右键,从上下文菜单中选择 Toggle breakpoint。 16 | 17 | **从中间开始执行** 18 | 可以让 Selenium IDE 从测试案例中间的一个特定命令处开始执行。这个功能也主要用于调试。设置起点的方法是,在需要中断的命令上,单击鼠标右键,从上下文菜单中选择 Set/Clear Start Point。 19 | 20 | **运行一个命令** 21 | 双击任何一个命令来单独执行它。在编写命令时,这个功能很有用。它允许你立即测试编写的命令,尤其是当你不确定它是否正确时。您可以双击它,看它是否运行正确,也可以从上下文菜单中操作。 22 | -------------------------------------------------------------------------------- /2.9/SUMMARY.md: -------------------------------------------------------------------------------- 1 | # 目录 2 | 3 | - [前言](README.md) 4 | - [简介](Introduction.md) 5 | - [安装 Selenium IDE](Install.md) 6 | - [启动 Selenium IDE](Open.md) 7 | - [IDE 的功能](Features.md) 8 | - [制作测试案例](Build.md) 9 | - [运行测试案例](Run.md) 10 | - [使用基址运行测试案例](BaseURL.md) 11 | - [Selenium 命令集:Selenese](Selenese.md) 12 | - [脚本语法](Script.md) 13 | - [测试套件](Suites.md) 14 | - [Selenium 常用命令](Commonly.md) 15 | - [验证页面元素](Verify.md) 16 | - [断言和验证](Assertion.md) 17 | - [定位元素](Locating.md) 18 | - [匹配文本模式](Patterns.md) 19 | - [AndWait 命令](AndWait.md) 20 | - [AJAX 应用中的 WaitFor 命令](WaitFor.md) 21 | - [顺序执行和流程控制](Flow.md) 22 | - [访问器命令和变量参数](Variables.md) 23 | - [JavaScript 和 Selenese 变量参数](JavaScript.md) 24 | - [echo - Selenese 打印命令](echo.md) 25 | - [警告、弹窗和多个窗口](Alert.md) 26 | - [调试脚本](Debugging.md) 27 | - [编写测试套件](TestSuite.md) 28 | - [用户自定义扩展](Extensions.md) 29 | - [格式化](Format.md) 30 | - [跨浏览器运行 Selenium IDE 脚本](Browsers.md) 31 | - [排错](Troubleshooting.md) 32 | -------------------------------------------------------------------------------- /2.9/Script.md: -------------------------------------------------------------------------------- 1 | # 脚本语法 2 | 3 | Selenium 的命令很简单,他们包括命令和两个参数。例如: 4 | 5 | | verifyText | //div//a[2] | Login | 6 | | ------------- | ---------------- | ------------ | 7 | 8 | 参数并不总是必需的,这取决于命令。在某些情况下,两个参数都是必需的,有些情况只需要一个参数,还有些情况可能不需要任何参数。下面有几个例子: 9 | 10 | | 命令 | 目标 | 值 | 11 | | ------------- | ------------------------------------------- | ------------ | 12 | | goBackAndWait | | | 13 | | verifyTextPresent | Welcome to My Home Page | | 14 | | type | id=phone | (555) 666-7066 | 15 | | type | id=address1 | ${myVariableAddress} | 16 | 17 | 命令参考中有每个命令参数的描述。 18 | 19 | 命令的参数虽各不相同,但是他们通常是: 20 | 21 | * locatoer 定位器用来识别页面中的UI元素。 22 | * text pattern 文本模式用来验证或断言页面内容。 23 | * text pattern 文本模式或 Selenium 变量用来在文本输入域中输入文本或在选项列表中选择一个选项。 24 | 25 | 定位器、文本模式,Selenium 变量和命令本身在 Selenium 命令中有非常详细地描述。       26 | 27 | Selenium IDE 中运行的脚本,会存储在一个 HTML 格式的文本文件中。他被包含在一个三列的 HTML 表格中。第一列是 Selenium 命令,第二列是目标,最后一列是值。第二列和第三列可能不需要,这取决于所选的 Selenium 命令,但他们应该存在。每个表格行代表一个 Selenium 命令。下面是一个脚本的例子,在这个脚本中会打开一个页面,然后断言页面标题,最后验证页面上的一些内容: 28 | 29 | ```html 30 | 31 | 32 | 33 | 34 |
open/download/
assertTitleDownloads
verifyText//h2Downloads
35 | ``` 36 | 37 | 这个脚本文件在浏览器中呈现为表格的样子如下: 38 | 39 | | open | /download/ | | 40 | | ------------- | ---------------- | ------------ | 41 | | assertTitle | Downloads | | 42 | | verifyText | //h2 | Downloads | 43 | 44 | Selenese HTML 语法可以用来编写和运行测试,而无需编程语言的知识。有了 selenese 的基本知识和 Selenium IDE 你可以快速制作和运行测试案例。 45 | -------------------------------------------------------------------------------- /2.9/Selenese.md: -------------------------------------------------------------------------------- 1 | # Selenium 命令集:Selenese 2 | 3 | Selenium 命令通常被称为 selenese,是用来运行测试的一个命令的集合。这些命令的序列是一个测试脚本。这里将详细解释这些命令,展示使用 Selenium 测试 web 应用程序时的很多选择。 4 | 5 | Selenium 提供了一组丰富的命令,以几乎任何你可以想象的方式,全方位测试你的 web 应用。这些命令通常被称为 selenese 命令集,这些命令基本上构造了一个测试语言。 6 | 7 | 例如,利用 selenese,你可以依据 UI 元素的 HTML 标记来测试该 UI 元素在页面上是否存在,测试页面上的具体内容,测试失效链接,输入字段,下拉列表选择,待提交的表单,表格数据,等等。此外,Selenium 命令还能测试窗口大小,鼠标位置、alerts 信息、Ajax 功能,弹出窗口,事件处理,以及许多其他 web 应用程序的特性。[命令参考](http://release.seleniumhq.org/selenium-core/1.0.1/reference.html)中列出了所有可用的命令。 8 | 9 | 命令会告诉 Selenium 做什么。Selenium 命令分三大类:Action 动作,Accessors 访问器和 Assertions 判断。 10 | 11 | - Action 动作类命令,一般用来操作应用程序的状态。他们做的事情,类似:点击这个链接、选择那个选项。如果动作失败,或者有错误,当前测试会停止执行。 12 | 13 | 许多动作会增加一个 AndWait 后缀,如:clickAndWait。这个后缀告诉 Selenium 动作将会导致浏览器发送请求到服务器,而 Selenium 应该等待一个新页面被完全加载。 14 | 15 | - Accessors 访问器类命令,用来检查应用程序的状态,并将结果存储在变量中。如:storeTitle。他们也用于自动生成断言。 16 | 17 | - Assertions 判断类命令,很像访问器类命令,但他们验证应用程序的状态是否符合预期。例如:包括 "make sure the page title is X" 和 "verify that this checkbox is checked"。 18 | 19 | 所有Selenium 判断类命令又分三种使用方式:assert 断言类,verify 验证类,和 waitFor 等待类。例如,你可以 assertText,verifyText 和 waitForText。当一个 assert 失败时,测试会中止。当一个 verify 失败时,测试将继续执行,记录下失败信息。可以用一个 assert 命令确保应用程序在正确的页面上,紧随其后的是一组 verify 判断来测试表单字段值,标签,等等。 20 | 21 | waitFor 命令等待一些条件发生(在测试 Ajax 应用程序时,非常有用)。如果条件已经是正确的,他们马上会成功。如果条件在超时设置的范围内不成立,他们将失败并停止测试。 22 | -------------------------------------------------------------------------------- /2.9/Suites.md: -------------------------------------------------------------------------------- 1 | # 测试套件 2 | 3 | 测试套件是测试的集合。通常会在一个测试套件将所有的测试作为一个连续的批处理作业运行。 4 | 5 | Selenium IDE 可以用一个简单的 HTML 文件来定义测试套件。语法也很简单。一个 HTML 表格定义了一个测试列表,其中的每一行定义了每个测试文件的路径。举个例子: 6 | 7 | ```html 8 | 9 | 10 | Test Suite Function Tests - Priority 1 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
Suite Of Tests
Login
Test Searching for Values
Test Save
19 | 20 | 21 | ``` 22 | 23 | 类似上面这个文件这将允许 Selenium IDE 逐一运行测试。 24 | 25 | 测试套件还可以用 Selenium RC 来维护。通过编程,可以有多种实现方式。如果使用 Selenium RC 和 Java,通常使用 Junit 来维护一个测试套件。此外,如果使用 C# 语言,Nunit 可以用来维护测试套件。如果使用解释型语言像 Python,Selenium RC 需要添加一些简单的编程,来建立一个测试套件。因为 Selenium RC 可以使用程序代码的编程逻辑,所以实现测试套件并不困难。 26 | -------------------------------------------------------------------------------- /2.9/TestDesignIntro.md: -------------------------------------------------------------------------------- 1 | 本章提供的信息不仅对新进入自动化测试领域的工程师有帮助,而且对于经验丰富的质量保证专业人士也同样有益。这里我们讨论了自动化测试的各种最常见的类型。我们还介绍了自动化测试领域™常用的€˜“设计模式”以及如何提升自动化脚本的可维护性和可扩展性。对于有经验的用户如果还没有使用这些技术会发现这些问题非常有趣。 2 | -------------------------------------------------------------------------------- /2.9/TestSuite.md: -------------------------------------------------------------------------------- 1 | # 编写测试套件 2 | 3 | 测试套件是测试用例的集合,测试用例在 Selenium IDE 的左侧窗格中进行管理。通过点击一排带小点的分隔条,可以手动的打开和关闭左侧面板。 4 | 5 | 当用户通过文件菜单打开一个现有的测试套件或新建一个测试用例时,测试套件面板会自动打开。在后一种情况下,新建的测试用例将立即出现在以前的测试用例下面。 6 | 7 | 通过“文件”->“添加测试用例”菜单项,Selenium IDE 也支持加载已有的测试用例。可以将现有测试用例添加到一个新的测试套件中。 8 | 9 | 一个测试套件文件是一个 HTML 文件,其中包含一个单列的表格。 中每行中的单元格中包含了一个测试用例文件的链接。下面是一个包含了四个测试用例的测试套件的例子: 10 | 11 | 12 | ```html 13 | 14 | 15 | 16 | Sample Selenium Test Suite 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 |
Test Cases for De Anza A-Z Directory Links
A Links
B Links
C Links
D Links
30 | 31 | 32 | ``` 33 | 34 | **注意** 35 | 36 | 测试套件与测试案例文件之间的路径关系,不要随便改变。如果路径关系改变了,一定要记着更新文件中的链接地址。 37 | -------------------------------------------------------------------------------- /2.9/Troubleshooting.md: -------------------------------------------------------------------------------- 1 | # 排错 2 | 3 | 下面成对的图片/解释列表描述了 Selenium IDE 中经常会出现的问题及原因: 4 | 5 | _Table view is not available with this format._ 6 | _这种格式的表格视图不可用。_ 7 | 8 | Selenium IDE 启动时这个消息偶尔会显示在表格视图中。Selenium IDE 的工作区将会关闭并重启。要想了解更多信息,请见 [issue 1008](http://code.google.com/p/selenium/issues/detail?id=1008)。如果你能复现这个问题,请提供具体细节以便我们修复此问题。 9 | 10 | --- 11 | _error loading test case: no command found_ 12 | _测试用例加载错误:命令没有找到_ 13 | 14 | 你一定是用“文件 => 打开”试图打开一个测试套件文件。请使用“文件 => 打开测试套件”菜单进行操作。 15 | 16 | 一个改进请求已提交了,希望改善这个错误消息。请见 [issue 1010](http://code.google.com/p/selenium/issues/detail?id=1010)。 17 | 18 | --- 19 | ![](images/chapt3_img28_Trouble_timing.webp) 20 | 21 | 这种类型的**错误**可能表明一个时间问题,例如,命令中定位器指定的元素在命令执行的时候没有完全加载。尝试在命令前面插入一个 **pause 5000** 的命令来确定是否确实是与时间相关的问题。如果是这样,在失败的命令之前使用一个适当的 **waitFor\*** 或 **\*AndWait** 命令。 22 | 23 | --- 24 | ![](images/chapt3_img29_Trouble_param.webp) 25 | 26 | 类似上面的例子,你在 **open** 命令中,试图使用变量而导致失败,提示你在使用变量中的值之前并没有创建这个变量。这是由于把变量的**值**字段,应该放在**目标**字段。在上面的示例中,**store** 命令的两个参数顺序放反了。对于任何 Selenese 命令,第一个参数必须在**目标**字段,第二个参数(如果有的话)必须在**值**字段。 27 | 28 | --- 29 | _error loading test case: [Exception... “Component returned failure code: 0x80520012 (NS_ERROR_FILE_NOT_FOUND) [nsIFileInputStream.init]” nresult: “0x80520012 (NS_ERROR_FILE_NOT_FOUND)” location: “JS frame :: chrome://selenium-ide/content/file-utils.js :: anonymous :: line 48” data: no]_ 30 | 31 | 测试套件中的某个测试用例无法找到。确保测试用例确实位于测试套件中所指定的位置。同时,确保实际的测试用例文件扩展名是 .html ,并且在测试套件文件中指定的也是 .html 扩展名。 32 | 33 | 一个改进请求已提交了,希望改善这个错误消息。请见 [issue 1011](http://code.google.com/p/selenium/issues/detail?id=1011)。 34 | 35 | --- 36 | ![](images/chapt3_img27_Trouble_extension.webp) 37 | 38 | Selenium IDE 没有载入相应的 js 扩展。确保你在 **Options => Options => General **中的 **Selenium Core extensions** 字段填写了正确的 js 扩展文件的名称和地址。并且,任何时候修改了 **Selenium Core extensions** 字段的值之后,Selenium IDE 都必须重新启动。 39 | -------------------------------------------------------------------------------- /2.9/Types.md: -------------------------------------------------------------------------------- 1 | 你应该测试应用程序的哪些部分?这取决于项目的具体情况,包括:用户期望,项目周期,项目经理对项目优先级的设定,等。一旦定义好了项目边界,测试工程师肯定会对测试工作做出多方面的决策。 2 | 3 | 我们€™在下文提到 web 应用测试的几种类型。这些术语绝不是标准,但是这些概念在 web 应用测试中确实是非常典型的。 4 | 5 | # 静态内容测试 6 |    7 | 内容测试,这是最简单的测试类型,只需要测试一个静态的,不变的,UI元素出现在页面上。例如: 8 | 9 | - 每个网页有预期的页面标题吗?这可以用于验证点击链接后的预期页面。 10 | - web 应用主页面的顶部是否包含一个图片? 11 | - 网站的每个页面是否包含一个页脚区,该区域包含公司的联系页面,法律政策和商标信息页面的链接? 12 | - 每个页面开头的标题文字是否使用 h1 标记?并且,每个页面是否有正确的标题文本? 13 | 14 | 测试内容对于你来说有可能需要,也可能没必要。如果你的页面内容很少改动或者不太重要,那么手工测试页面内容就足够了。假如 web 应用包含的文件被移动到不同的位置,内容测试可能就会很有价值。 15 | 16 | # 链接测试 17 | 18 | 网站经常的错误来源是链接失效或链接的页面丢失。这种测试工作包括点击每个链接并验证预期页面。如果是静态链接并且很少改变,手工测试可能就足够了。但是如果网页设计师经常改变链接,或者偶尔发生文件迁移,链接测试应该实现自动化。 19 | 20 | # 功能测试 21 | 22 | 测试应用程序的特定功能,需要某种类型的用户输入,并返回某种类型的结果。通常功能测试会涉及多个页面,有基于表单的输入页面,包含多个输入字段的集合,以及提交和取消操作,有一个或多个响应页面。用户可以通过文本字段、复选框、下拉列表、或任何其他浏览器支持的控件进行输入。    23 | 功能测试通常是自动化测试中最复杂的,但通常是最重要的。典型的测试可以是登录操作,账户注册,用户账户操作,修改帐户设置,复杂的跨域数据检索,等等。功能测试通常对应于特定的用户场景,而用户场景是对应用程序功能和特性的描述。 24 | 25 | # 测试动态元素 26 | 27 | 通常一个 web 页面元素都有一个唯一的标识符用于在页面中定位该元素。通常是通过 html 标记的 €˜id€ ™属性或 name 属性来实现的。这些名字可以是静态的,即,不变的字符串常量。它们也可以是每个页面动态生成的值。例如,一些 web 服务器可能在一个页面实例上为显示的文档命名为 doc3861 ,用户检索的另一个页面实例为该文档命名为 €˜doc6148a。一个验证文档存在的测试脚本可能没有一个统一的标识符用于定位文档。通常,结果页面上不同标识符指定的动态元素往往基于用户的动作。这当然取决于 web 应用的功能。 28 | 29 | 这里有一个例子: 30 | ```html 31 | 33 | ``` 34 | 35 | # Ajax 测试 36 | 37 | Ajax 是一种技术,来支持动态变化的用户界面元素,界面元素可以动态更改而无需浏览器重新加载页面,例如:动画、RSS 种子和实时数据更新。有无数方法可以使用 Ajax 更新 web 页面上的元素。但是,最简单的方法是在 ajax 开发的应用程序中,从应用程序服务器检索数据,然后显示在页面上,而不用重新加载整个页面。只有一部分的页面或者仅仅是元素本身被重新加载。 38 | -------------------------------------------------------------------------------- /2.9/Validating.md: -------------------------------------------------------------------------------- 1 | <待续> 2 | -------------------------------------------------------------------------------- /2.9/Variables.md: -------------------------------------------------------------------------------- 1 | # 访问器命令和变量参数 2 | 3 | 在脚本的开头,可以使用 Selenium 变量来存储常数。另外,在数据驱动测试中(将在后面一节中讨论),Selenium 变量可用于存储从命令行,从另一个程序,或从一个文件中传递的数据。 4 | 5 | store 命令是所有存储命令中最基础的命令,它仅仅能把一个常量存储在一个 Selenium 变量中。它包括两个参数,存储的文本值和 Selenium 变量。使用标准的变量命名约定来为变量起名,即变量名中只能包含字母和数字。 6 | 7 | | 命令 | 目标 | 值 | 8 | | ------- | --------- | ------------ | 9 | | store | paul@mysite.org | userName | 10 | 11 | 在后面的脚本中,你可以使用变量中的数据。要访问变量的值,用花括号({ })括住变量名,并前置一个美元符号。 12 | 13 | | 命令 | 目标 | 值 | 14 | | ---------- | ------- | ------------ | 15 | | verifyText | //div/p | ${userName} | 16 | 17 | 变量的常见用法是存储 input 字段中的输入数据。 18 | 19 | | 命令 | 目标 | 值 | 20 | | ----- | ---------- | ------------ | 21 | | type | id = login | ${userName} | 22 | 23 | 24 | Selenium 变量可以用在第一或第二个参数,并且相比较其他操作符会被命令优先解释执行。Selenium 变量也可以用在一个定位器表达式中。 25 | 26 | 每个验证和断言命令都有等价的 store 命令。下面是一些常用的 store 命令。 27 | 28 | **storeElementPresent** 29 | 30 | 对应于 verifyElementPresent 命令。它存储一个布尔值 true 或 false ,取决于 UI 元素是否出现。 31 | 32 | **storeText** 33 | 34 | StoreText 对应于 verifyText 命令。它使用一个定位器来识别页面文本。如果找到文本,则存储在变量中。StoreText 可以用来提取被测页面中的文本信息。 35 | 36 | **storeEval** 37 | 38 | 该命令需要一个脚本作为第一个参数。在 Selenese 中使用 JavaScript 参数,将在下一节中介绍。StoreEval 允许将 JavaScript 脚本运行的结果存储在一个变量中。 39 | -------------------------------------------------------------------------------- /2.9/Verify.md: -------------------------------------------------------------------------------- 1 | # 验证页面元素 2 | 3 | 验证 UI 元素是否出现在网页上,是最常见的自动化测试任务之一。Selenese 有多种手段来检查 UI 元素。重要的是,你要了解这些不同的方法,因为这些方法定义了你的测试行为。 4 | 5 | 例如,你会测试…… 6 | 7 | 1. 元素是否出现在页面上? 8 | 2. 特定的文本是否出现在页面上? 9 | 3. 特定的文本是否出现页面的指定位置? 10 | 11 | 例如,如果您正在测试一个文本标题,文本和它的位置在页面的顶部,对于你的测试可能很重要。然而,如果您正在测试一个主页,这个主页面上有一个图片,网页设计师经常改变页面上的图片文件以及图片出现的位置,这时你只需要测试图片(而不是特定的图像文件)在页面上是否出现就可以了。 12 | -------------------------------------------------------------------------------- /2.9/WaitFor.md: -------------------------------------------------------------------------------- 1 | # AJAX 应用中的 WaitFor 命令 2 | 3 | 在 AJAX 驱动的 web 应用程序中,应用程序从服务器检索数据,而无需刷新页面。andWait 命令在页面没有真正刷新前不会工作。让当前运行的测试暂停一段时间也不是一个好方法,因为被测的 web 元素可能比预定的暂停时间出现的略晚或稍早,这主要取决于系统的响应能力,负载大小或其他不可控因素,这些都会导致测试失败。最好的方法就是在一个动态的时长内等待所需的元素,一旦找到界面元素,继续执行测试。 4 | 5 | waitFor 命令实现了上述功能,waitForElementPresent 或 waitForVisible,这些命令会动态的等待,每隔一秒会检查所需的条件,一旦条件满足则继续执行脚本中的下一个命令。 6 | -------------------------------------------------------------------------------- /2.9/Wrapping.md: -------------------------------------------------------------------------------- 1 | <待续> 2 | -------------------------------------------------------------------------------- /2.9/book.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Selenium IDE 帮助文章", 3 | "discription": "Selenium IDE 帮助文章", 4 | "author": "王顶", 5 | "language": "zh-hans", 6 | "plugins": [ 7 | "-lunr", 8 | "-search", 9 | "-highlight", 10 | "-sharing", 11 | "edit-link", 12 | "forkmegithub-cn", 13 | "search-plus", 14 | "sharing-plus", 15 | "anchor-navigation-ex", 16 | "copy-code-button", 17 | "prism", 18 | "splitter", 19 | "image-captions-extended", 20 | "bsz", 21 | "fancybox", 22 | "image-wrapper", 23 | "gtalk", 24 | "versions-select" 25 | ], 26 | "pluginsConfig": { 27 | "versions": { 28 | "gitbookConfigURL": "http://selenium.wangding.co/book.json", 29 | "options": [ 30 | { 31 | "value": "http://selenium.wangding.co", 32 | "text": "v3.9" 33 | }, 34 | { 35 | "value": "http://selenium.wangding.co/2.9/", 36 | "text": "v2.9" 37 | }] 38 | }, 39 | "gtalk": { 40 | "clientID": "c0fb01d8974fad3f4b9e", 41 | "clientSecret": "14af1e32e0a8bedc62a6e3ce097ae2fc5e8cc1d8", 42 | "repo": "selenium-ide-doc", 43 | "owner": "wangding", 44 | "admin": ["wangding"], 45 | "labels": ["SeIDE"] 46 | }, 47 | "anchor-navigation-ex": { 48 | "multipleH1": false 49 | }, 50 | "forkmegithub-cn": { 51 | "url": "https://github.com/wangding/selenium-ide-doc", 52 | "color": "red" 53 | }, 54 | "edit-link": { 55 | "base": "https://github.com/wangding/selenium-ide-doc/blob/master/", 56 | "label": "编辑本页" 57 | }, 58 | "sharing": { 59 | "douban": true, 60 | "facebook": false, 61 | "google": false, 62 | "hatenaBookmark": false, 63 | "instapaper": false, 64 | "line": false, 65 | "linkedin": false, 66 | "messenger": false, 67 | "pocket": false, 68 | "qq": true, 69 | "qzone": true, 70 | "stumbleupon": false, 71 | "twitter": false, 72 | "viber": false, 73 | "vk": false, 74 | "weibo": true, 75 | "whatsapp": false, 76 | "all": [ 77 | "weibo", "douban", "qzone", "qq" 78 | ] 79 | }, 80 | "image-captions": { 81 | "caption": "图:_CAPTION_" 82 | }, 83 | "bsz": { 84 | "copyright": "2016 -  by 王顶. All rights reserved." 85 | } 86 | }, 87 | "styles": { 88 | "website": "styles/website.css" 89 | } 90 | } 91 | -------------------------------------------------------------------------------- /2.9/echo.md: -------------------------------------------------------------------------------- 1 | # echo - Selenese 打印命令 2 | 3 | Selenese 有一个简单的命令可以在测试时打印输出文本。当测试在运行时,在控制台中打印显示测试中的信息,这个功能往往是非常有用的。这些信息可以用来提供测试上下文的结果报告,当你在测试中发现问题时,这个结果报告经常用来报告测试页面时发现的缺陷。最后,还可以使用 echo 语句打印 Selenium 变量的内容。 4 | -------------------------------------------------------------------------------- /2.9/images/chapt3_img01_IDE_Installation.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangding/selenium-ide-doc/e881bbaa55fc876267f95614c5f7ec29661ca11e/2.9/images/chapt3_img01_IDE_Installation.webp -------------------------------------------------------------------------------- /2.9/images/chapt3_img02_IDE_Installation.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangding/selenium-ide-doc/e881bbaa55fc876267f95614c5f7ec29661ca11e/2.9/images/chapt3_img02_IDE_Installation.webp -------------------------------------------------------------------------------- /2.9/images/chapt3_img03_IDE_Installation.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangding/selenium-ide-doc/e881bbaa55fc876267f95614c5f7ec29661ca11e/2.9/images/chapt3_img03_IDE_Installation.webp -------------------------------------------------------------------------------- /2.9/images/chapt3_img04_IDE_Installation.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangding/selenium-ide-doc/e881bbaa55fc876267f95614c5f7ec29661ca11e/2.9/images/chapt3_img04_IDE_Installation.webp -------------------------------------------------------------------------------- /2.9/images/chapt3_img05_IDE_open.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangding/selenium-ide-doc/e881bbaa55fc876267f95614c5f7ec29661ca11e/2.9/images/chapt3_img05_IDE_open.webp -------------------------------------------------------------------------------- /2.9/images/chapt3_img06_IDE_features.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangding/selenium-ide-doc/e881bbaa55fc876267f95614c5f7ec29661ca11e/2.9/images/chapt3_img06_IDE_features.webp -------------------------------------------------------------------------------- /2.9/images/chapt3_img07_Speed_Control.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangding/selenium-ide-doc/e881bbaa55fc876267f95614c5f7ec29661ca11e/2.9/images/chapt3_img07_Speed_Control.webp -------------------------------------------------------------------------------- /2.9/images/chapt3_img08_Run_All.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangding/selenium-ide-doc/e881bbaa55fc876267f95614c5f7ec29661ca11e/2.9/images/chapt3_img08_Run_All.webp -------------------------------------------------------------------------------- /2.9/images/chapt3_img09_Run.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangding/selenium-ide-doc/e881bbaa55fc876267f95614c5f7ec29661ca11e/2.9/images/chapt3_img09_Run.webp -------------------------------------------------------------------------------- /2.9/images/chapt3_img10_Pause.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangding/selenium-ide-doc/e881bbaa55fc876267f95614c5f7ec29661ca11e/2.9/images/chapt3_img10_Pause.webp -------------------------------------------------------------------------------- /2.9/images/chapt3_img11_Resume.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangding/selenium-ide-doc/e881bbaa55fc876267f95614c5f7ec29661ca11e/2.9/images/chapt3_img11_Resume.webp -------------------------------------------------------------------------------- /2.9/images/chapt3_img12_Step.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangding/selenium-ide-doc/e881bbaa55fc876267f95614c5f7ec29661ca11e/2.9/images/chapt3_img12_Step.webp -------------------------------------------------------------------------------- /2.9/images/chapt3_img13_TestRunner_Mode.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangding/selenium-ide-doc/e881bbaa55fc876267f95614c5f7ec29661ca11e/2.9/images/chapt3_img13_TestRunner_Mode.webp -------------------------------------------------------------------------------- /2.9/images/chapt3_img14_Apply_Rollup_Rules.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangding/selenium-ide-doc/e881bbaa55fc876267f95614c5f7ec29661ca11e/2.9/images/chapt3_img14_Apply_Rollup_Rules.webp -------------------------------------------------------------------------------- /2.9/images/chapt3_img15_Record.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangding/selenium-ide-doc/e881bbaa55fc876267f95614c5f7ec29661ca11e/2.9/images/chapt3_img15_Record.webp -------------------------------------------------------------------------------- /2.9/images/chapt3_img16_Table_Format.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangding/selenium-ide-doc/e881bbaa55fc876267f95614c5f7ec29661ca11e/2.9/images/chapt3_img16_Table_Format.webp -------------------------------------------------------------------------------- /2.9/images/chapt3_img17_Entry_Fields.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangding/selenium-ide-doc/e881bbaa55fc876267f95614c5f7ec29661ca11e/2.9/images/chapt3_img17_Entry_Fields.webp -------------------------------------------------------------------------------- /2.9/images/chapt3_img18_Bottom_Box.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangding/selenium-ide-doc/e881bbaa55fc876267f95614c5f7ec29661ca11e/2.9/images/chapt3_img18_Bottom_Box.webp -------------------------------------------------------------------------------- /2.9/images/chapt3_img19_Bottom_Box_Ref.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangding/selenium-ide-doc/e881bbaa55fc876267f95614c5f7ec29661ca11e/2.9/images/chapt3_img19_Bottom_Box_Ref.webp -------------------------------------------------------------------------------- /2.9/images/chapt3_img21_BaseURL_prod.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangding/selenium-ide-doc/e881bbaa55fc876267f95614c5f7ec29661ca11e/2.9/images/chapt3_img21_BaseURL_prod.webp -------------------------------------------------------------------------------- /2.9/images/chapt3_img22_BaseURL_beta.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangding/selenium-ide-doc/e881bbaa55fc876267f95614c5f7ec29661ca11e/2.9/images/chapt3_img22_BaseURL_beta.webp -------------------------------------------------------------------------------- /2.9/images/chapt3_img23_IDE_Locator_Assistance.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangding/selenium-ide-doc/e881bbaa55fc876267f95614c5f7ec29661ca11e/2.9/images/chapt3_img23_IDE_Locator_Assistance.webp -------------------------------------------------------------------------------- /2.9/images/chapt3_img27_Trouble_extension.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangding/selenium-ide-doc/e881bbaa55fc876267f95614c5f7ec29661ca11e/2.9/images/chapt3_img27_Trouble_extension.webp -------------------------------------------------------------------------------- /2.9/images/chapt3_img28_Trouble_timing.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangding/selenium-ide-doc/e881bbaa55fc876267f95614c5f7ec29661ca11e/2.9/images/chapt3_img28_Trouble_timing.webp -------------------------------------------------------------------------------- /2.9/images/chapt3_img29_Trouble_param.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangding/selenium-ide-doc/e881bbaa55fc876267f95614c5f7ec29661ca11e/2.9/images/chapt3_img29_Trouble_param.webp -------------------------------------------------------------------------------- /2.9/images/chapt3_img32_Extensions_install.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangding/selenium-ide-doc/e881bbaa55fc876267f95614c5f7ec29661ca11e/2.9/images/chapt3_img32_Extensions_install.webp -------------------------------------------------------------------------------- /2.9/styles/website.css: -------------------------------------------------------------------------------- 1 | .image-wrapper { 2 | text-align: center; 3 | } 4 | -------------------------------------------------------------------------------- /3.9/README.md: -------------------------------------------------------------------------------- 1 | # 简介 2 | 3 | Selenium IDE 是一款 web UI 自动化测试工具,是基于录制和回放操作的火狐浏览器的插件。本教程是官方资料的翻译。 4 | 5 | 如果不喜欢阅读文字教程,可以尝试学习 [Selenium IDE web 自动化测试视频课程](https://github.com/wangding/courses/blob/master/seleniumIDE/README.md),并完成相应的通关任务。 6 | 7 | -------------------------------------------------------------------------------- /3.9/SUMMARY.md: -------------------------------------------------------------------------------- 1 | # 目录 2 | 3 | - [前言](README.md) 4 | 5 | ## 入门 6 | 7 | - [快速上手](getting-started.md) 8 | - [命令行运行器](command-line-runner.md) 9 | - [控制流](control-flow.md) 10 | - [代码导出](code-export.md) 11 | - [常见问题](faq.md) 12 | 13 | ## API 参考 14 | 15 | - [命令](commands.md) 16 | - [参数](arguments.md) 17 | -------------------------------------------------------------------------------- /3.9/arguments.md: -------------------------------------------------------------------------------- 1 | # 参数 2 | 3 | ## alertText 4 | 5 | - 名称:alert text 6 | - 描述:要检查的文字 7 | 8 | --- 9 | ## answer 10 | 11 | - 名称:answer 12 | - 描述:给出响应弹出提示的答案。 13 | 14 | --- 15 | ## attributeLocator 16 | 17 | - 名称:attribute locator 18 | - 描述:一个元素定位器,后跟一个@符号,然后是属性的名称,例如“foo @ bar”。 19 | 20 | --- 21 | ## arrayVariableName 22 | 23 | - 名称:array variable name 24 | - 描述:包含 JavaScript 数组的变量的名称。 25 | 26 | --- 27 | ## conditionalExpression 28 | 29 | - 名称:conditional expression 30 | - 描述:JavaScript 表达式,返回用于控制流命令的布尔结果。 31 | 32 | --- 33 | ## coord 34 | 35 | - 名称:coord string 36 | - 描述:指定鼠标事件相对于从定位器找到的元素的 `x`,`y` 位置(例如, - 10,20)。 37 | 38 | --- 39 | ## expectedValue 40 | 41 | - 名称:expected value 42 | - 描述:您期望变量包含的结果(例如,true,false或其他值)。 43 | 44 | --- 45 | ## expression 46 | 47 | - 名称:expression 48 | - 描述:您要存储的值。 49 | 50 | --- 51 | ## formLocator 52 | 53 | - 名称:form locator 54 | - 描述:要提交的表单的元素定位器。 55 | 56 | --- 57 | ## handle 58 | 59 | - 名称:window handle 60 | - 描述:表示特定页面(选项卡或窗口)的句柄。 61 | 62 | --- 63 | ## iteratorVariableName 64 | 65 | - 名称:iterator variable name 66 | - 描述:在循环控制流命令中迭代集合时使用的变量的名称(例如,对于每个)。 67 | 68 | --- 69 | ## json 70 | 71 | - 名称:json 72 | - 描述:JavaScript 对象的字符串表示形式。 73 | 74 | --- 75 | ## keySequence 76 | 77 | - 名称:key sequence 78 | - 描述:要键入的键序列,可用于发送键击(例如$ {KEY_ENTER})。 79 | 80 | --- 81 | ## locator 82 | 83 | - 名称:locator 84 | - 描述:元素定位器。 85 | 86 | --- 87 | ## locatorOfDragDestinationObject 88 | 89 | - 名称:locator of drag destination object 90 | - 描述:元素的定位符,其位置(例如,其中最中心的像素)将是要拖动的对象的定位符被丢弃的点。 91 | 92 | --- 93 | ## locatorOfObjectToBeDragged 94 | 95 | - 名称:locator of object to be dragged 96 | - 描述:要拖动的元素的定位器。 97 | 98 | --- 99 | ## loopLimit 100 | 101 | - 名称:loop limit 102 | - 描述:可选参数,指定循环控制流命令可以执行的最大次数。这可以防止无限循环。默认值设置为1000。 103 | 104 | --- 105 | ## message 106 | 107 | - 名称:message 108 | - 描述:要打印的消息。 109 | 110 | --- 111 | ## optionLocator 112 | 113 | - 名称:option 114 | - 描述:选项定位器,通常只是一个选项标签(例如“John Smith”)。 115 | 116 | --- 117 | ## pattern 118 | 119 | - 名称:text 120 | - 描述:精确的字符串匹配。对模式匹配的支持正在进行中。有关详细信息,请参阅 https://github.com/SeleniumHQ/selenium-ide/issues/141。 121 | 122 | --- 123 | ## region 124 | 125 | - 名称:region 126 | - 描述:指定一个带坐标和长度的矩形(例如,“x:257,y:300,width:462,height:280”)。 127 | 128 | --- 129 | ## resolution 130 | 131 | - 名称:resolution 132 | - 描述:使用 WidthxHeight 指定窗口分辨率。(例如,1280 x 800)。 133 | 134 | --- 135 | ## script 136 | 137 | - 名称:script 138 | - 描述:要运行的 JavaScript 代码段。 139 | 140 | --- 141 | ## selectLocator 142 | 143 | - 名称:select locator 144 | - 描述:标识下拉菜单的元素定位器。 145 | 146 | --- 147 | ## testCase 148 | 149 | - 名称:test case 150 | - 描述:项目中的测试用例名称。 151 | 152 | --- 153 | ## text 154 | 155 | - 名称:text 156 | - 描述:要验证的文本。 157 | 158 | --- 159 | ## times 160 | 161 | - 名称:times 162 | - 描述:一次控制流循环的次数将执行其块内的命令。 163 | 164 | --- 165 | ## url 166 | 167 | - 名称:url 168 | - 描述:要打开的 URL(可以是相对的或绝对的)。 169 | 170 | --- 171 | ## value 172 | 173 | - 名称:value 174 | - 描述:要键入的值。 175 | 176 | --- 177 | ## variableName 178 | 179 | - 名称:variable name 180 | - 描述:没有括号的变量的名称。 181 | 182 | --- 183 | ## waitTime 184 | 185 | - 名称:wait time 186 | - 描述:等待的时间量(以毫秒为单位)。 187 | 188 | --- 189 | ## xpath 190 | 191 | - 名称:xpath 192 | - 描述:要评估的 xpath 表达式。 193 | -------------------------------------------------------------------------------- /3.9/book.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Selenium IDE 帮助文章", 3 | "discription": "Selenium IDE 帮助文章", 4 | "author": "王顶", 5 | "language": "zh-hans", 6 | "plugins": [ 7 | "-lunr", 8 | "-search", 9 | "-highlight", 10 | "-sharing", 11 | "edit-link", 12 | "forkmegithub-cn", 13 | "search-plus", 14 | "sharing-plus", 15 | "anchor-navigation-ex", 16 | "copy-code-button", 17 | "prism", 18 | "splitter", 19 | "image-captions-extended", 20 | "bsz", 21 | "fancybox", 22 | "image-wrapper", 23 | "gtalk", 24 | "versions-select" 25 | ], 26 | "pluginsConfig": { 27 | "versions": { 28 | "gitbookConfigURL": "http://selenium.wangding.co/book.json", 29 | "options": [ 30 | { 31 | "value": "http://selenium.wangding.co", 32 | "text": "v3.9" 33 | }, 34 | { 35 | "value": "http://selenium.wangding.co/2.9/", 36 | "text": "v2.9" 37 | }] 38 | }, 39 | "gtalk": { 40 | "clientID": "c0fb01d8974fad3f4b9e", 41 | "clientSecret": "14af1e32e0a8bedc62a6e3ce097ae2fc5e8cc1d8", 42 | "repo": "selenium-ide-doc", 43 | "owner": "wangding", 44 | "admin": ["wangding"], 45 | "labels": ["SeIDE"] 46 | }, 47 | "anchor-navigation-ex": { 48 | "multipleH1": false 49 | }, 50 | "forkmegithub-cn": { 51 | "url": "https://github.com/wangding/selenium-ide-doc", 52 | "color": "red" 53 | }, 54 | "edit-link": { 55 | "base": "https://github.com/wangding/selenium-ide-doc/blob/master/3.9/", 56 | "label": "编辑本页" 57 | }, 58 | "sharing": { 59 | "douban": true, 60 | "facebook": false, 61 | "google": false, 62 | "hatenaBookmark": false, 63 | "instapaper": false, 64 | "line": false, 65 | "linkedin": false, 66 | "messenger": false, 67 | "pocket": false, 68 | "qq": true, 69 | "qzone": true, 70 | "stumbleupon": false, 71 | "twitter": false, 72 | "viber": false, 73 | "vk": false, 74 | "weibo": true, 75 | "whatsapp": false, 76 | "all": [ 77 | "weibo", "douban", "qzone", "qq" 78 | ] 79 | }, 80 | "image-captions": { 81 | "caption": "图:_CAPTION_" 82 | }, 83 | "bsz": { 84 | "copyright": "2016 -  by 王顶. All rights reserved." 85 | } 86 | }, 87 | "styles": { 88 | "website": "styles/website.css" 89 | } 90 | } 91 | -------------------------------------------------------------------------------- /3.9/code-export.md: -------------------------------------------------------------------------------- 1 | # 代码导出 2 | 3 | ## 入门 4 | 5 | 您可以通过右键单击测试或套件,选择 `Export`,选择目标语言并单击 `Export`,将测试或测试套件导出成 `WebDriver` 代码。 6 | 7 | ![export1,王顶,408542507@qq.com](https://www.seleniumhq.org/selenium-ide/img/docs/code-export/right-click.png) 8 | 9 | ![export2,王顶,408542507@qq.com](https://www.seleniumhq.org/selenium-ide/img/docs/code-export/menu.png) 10 | 11 | 这个操作会将包含目标语言导出代码的文件保存到浏览器的下载目录中。 12 | 13 | ### 来源追踪代码注释 14 | 15 | 导出时,有一个可选项来启用原始跟踪代码注释。 16 | 17 | 这将在导出的文件中放置内联代码注释,其中包含有关生成它的 Selenium IDE 中的测试步骤的详细信息。 18 | 19 | ## 支持的导出 20 | 21 | 目前,支持导出到 Java,确切的是 Java for JUnit。 22 | 23 | 我们打算在 Selenium 的所有官方编程语言(例如,Java,JavaScript,C#,Python 和 Ruby)中的每种语言中至少支持一个测试框架。 24 | 25 | 欢迎提供帮助,以帮助为给定语言添加新语言和测试框架。有关如何操作的详细信息,请参见[如何贡献](code-export.md#如何贡献)。 26 | 27 | ### Java JUnit 28 | 29 | Java JUnit 的导出代码是为了与 Java 8,JUnit 4.12 和最新版本的 Selenium 3 一起使用而构建的。 30 | 31 | 您应该能够获取导出的 Java 文件并将其放入标准 Maven 目录结构中,并使用 pom.xml 列出这些依赖项的文件并运行它。 32 | 33 | 下面是一个 `pom.xml` 示例,帮助您上手。 34 | 35 | ```xml 36 | 37 | 4.0.0 38 | org.seleniumhq.selenium 39 | selenium-ide-java-code-export 40 | 1 41 | http://maven.apache.org 42 | 43 | 44 | junit 45 | junit 46 | 4.12 47 | test 48 | 49 | 50 | org.seleniumhq.selenium 51 | selenium-java 52 | 3.141.59 53 | 54 | 55 | 56 | ``` 57 | 58 | ## 如何贡献 59 | 60 | 代码导出以模块化方式构建,以帮助实现贡献。 61 | 62 | 每种语言和测试框架都有自己的包,包含要导出的代码。每个代码片段映射到Selenium IDE 中的命令,并且每个这些包都依赖于底层的“核心”包,它可以完成所有繁重的任务。 63 | 64 | 下面是基于一个已经存在的语言,建立一个新语言或新测试框架的步骤。 65 | 66 | ### 创建一个新包 67 | 68 | 首先,复制现有的语言包(例如:`packages/code-export-java-junit`)并将其重命名(例如,文件夹和文件中的详细信息 `package.json`)到您想要贡献的目标语言和框架(例如:`packages/code-export-ruby-rspec`,等)。 69 | 70 | 接下来,在 `package.json` 中添加新的依赖软件包。 71 | 72 | 最后,在项目的根目录运行 `yarn` 命令。 73 | 74 | ### 更新定位器和命令 75 | 76 | 代码导出的机制是将特定语言的字符串转换为输出代码。其中最突出的是命令和定位器策略(例如,“by” 查找的语法)。 77 | 78 | 对于给定的语言,每个语句都有一个文件以及附带的测试文件。 79 | 80 | 你可以看到一个例子 `packages/code-export-java-junit`。 81 | 82 | - [命令](https://github.com/SeleniumHQ/selenium-ide/blob/v3/packages/code-export-java-junit/src/command.js) 83 | - [命令测试](https://github.com/SeleniumHQ/selenium-ide/blob/v3/packages/code-export-java-junit/__test__/src/command.spec.js) 84 | - [定位策略](https://github.com/SeleniumHQ/selenium-ide/blob/v3/packages/code-export-java-junit/src/location.js) 85 | - [定位策略测试](https://github.com/SeleniumHQ/selenium-ide/blob/v3/packages/code-export-java-junit/__test__/src/location.spec.js) 86 | 87 | 声明新命令时,可以将其输出为指定的字符串,也可以输出为指定[缩进级别](https://github.com/SeleniumHQ/selenium-ide/blob/v3/packages/code-export-java-junit/src/command.js#L242-L249)的对象。 88 | 89 | 内置于代码导出的是一个用于控制输出代码缩进的修饰符。如果您希望命令的输出是详细的并且是显式的,则此结构很有用。或者,如果该命令更改后面的命令的缩进级别。 90 | 91 | ### 创建钩子 92 | 93 | 钩子构成了要导出的代码结构的大部分(例如,套件,测试以及设置,拆卸等所有内容)。它们也是使插件能够将代码导出到测试或套件的不同部分的原因。 94 | 95 | 有 `9` 种不同的钩子: 96 | 97 | - afterAll (所有测试完成后) 98 | - afterEach(每次测试完成后 - 在 afterAll 之前) 99 | - beforeAll (在所有测试运行之前) 100 | - beforeEach(在每次测试之前 - 在 beforeAll 之后) 101 | - command (为插件添加的新命令发出代码) 102 | - dependency (添加附加语言依赖) 103 | - inEachBegin (在每个测试中,在它的开头) 104 | - inEachEnd (在每次测试中,在最后) 105 | - variable (声明要在整个套件中使用的新变量) 106 | 107 | 你可以在 `packages/code-export-java-junit` 这里看到一个钩子实例:Hooks 108 | 109 | ### 更新特定于语言的属性 110 | 111 | 在每种语言中,您需要指定一些低级细节。像缩进的空格,如何声明方法,测试,套件等等。 112 | 113 | 您可以在 `packages/code-export-java-junit` 此处查看此实现的示例:特定于语言的选项 114 | 115 | ### 将其添加到混合物中 116 | 117 | 一旦你完成了所有其他工作,就可以将其连接起来以便在UI中使用。 118 | 119 | 这是可能的 `packages/code-export/src/index.js`。 120 | 121 | 您需要添加语言 `availableLanguages`。 122 | 123 | ### 测试和调整 124 | 125 | 最佳的端到端测试的代码导出是导出一系列测试并验证它们是否按预期运行。 126 | 127 | 从开发构建中,您可以访问种子测试。这是验证所有标准库命令是否适用于您的新语言的良好起点。 128 | 129 | 测试,修复以及再测试,直到您对最终结果有信心。 130 | 131 | ### 提交 PR 132 | 133 | 你已经完成了艰难的任务。现在提交 PR 只是一个简单的问题。请对 `v3` 分支 PR。 134 | -------------------------------------------------------------------------------- /3.9/command-line-runner.md: -------------------------------------------------------------------------------- 1 | # 命令行运行器 2 | 3 | 您现在可以在任何浏览器上,以及在 Grid 上,同时运行所有 Selenium IDE 测试,而无需编写任何代码。 4 | 5 | 只需要安装 Selenium IDE 命令行运行器,获取必要的浏览器驱动程序(如果需要在本地运行测试),并从命令提示符启动运行器以及所需的选项。 6 | 7 | ![命令行运行器,王顶,408542507@qq.com](https://www.seleniumhq.org/selenium-ide/img/docs/runner.png) 8 | 9 | ## 先决条件 10 | 11 | 命令行运行器需要以下依赖项才能工作: 12 | 13 | - `node`(Node.js 编程语言)版本 `8` 或 `10` 14 | - `npm` (NodeJS 包管理器)通常随 `node` 同时安装 15 | - `selenium-side-runner` (Selenium IDE 命令行运行器) 16 | - 浏览器驱动程序(下面将详细介绍) 17 | 18 | ```sh 19 | > brew install node 20 | > npm install -g selenium-side-runner 21 | ``` 22 | 23 | **注意:您的系统配置可能与上面示例中使用的不同(例如,MacOS 上的 Homebrew)。如果是这样,请参阅[程序包管理器的 Node 安装文档](https://nodejs.org/en/download/package-manager/),或直接从 [Node 下载页面](https://nodejs.org/en/download/)下载适用于您的操作系统的 Node 安装程序。** 24 | 25 | ## 安装浏览器驱动程序 26 | 27 | 如果要在**本地**运行测试,则每个浏览器都需要一些额外的设置。 28 | 29 | Selenium 通过称为浏览器驱动程序的小型二进制应用程序与每个浏览器通信。每个浏览器都有自己的驱动程序,您可以手动下载并添加到系统路径,也可以使用包管理器安装最新版本的浏览器驱动程序(推荐)。 30 | 31 | 您还需要在计算机上安装浏览器。 32 | 33 | ### Chrome 34 | 35 | 对于 Chrome,您需要 [ChromeDriver](http://chromedriver.chromium.org)。 36 | 37 | ```sh 38 | > npm install -g chromedriver 39 | ``` 40 | 41 | ### Edge 42 | 43 | 对于 Microsoft Edge,您需要在 Windows 上运行,并且还需要 [EdgeDriver](https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/)。 44 | 45 | ```sh 46 | > npm install -g edgedriver 47 | ``` 48 | 49 | ### Firefox 50 | 51 | 对于 Firefox,您需要 [geckodriver](https://github.com/mozilla/geckodriver)。 52 | 53 | ```sh 54 | > npm install -g geckodriver 55 | ``` 56 | 57 | ### IE 58 | 59 | 对于 Internet Explorer,您需要在 Windows 上运行,并且还需要 [IEDriver](https://github.com/SeleniumHQ/selenium/wiki/InternetExplorerDriver)。 60 | 61 | ```sh 62 | > npm install -g iedriver 63 | ``` 64 | 65 | IEDriver 需要一些额外的设置才能工作,细节信息请查看[这里](https://github.com/SeleniumHQ/selenium/wiki/InternetExplorerDriver#required-configuration)。 66 | 67 | ### Safari 68 | 69 | 对于 Safari,您需要 [SafariDriver](https://developer.apple.com/documentation/webkit/testing_with_webdriver_in_safari)。 70 | 71 | 它随附最新版本的 Safari。只需几个步骤即可在您的计算机上启用它。有关详细信息,请参阅 [SafariDriver 文档的此部分](https://developer.apple.com/documentation/webkit/testing_with_webdriver_in_safari#2957277)。 72 | 73 | ## 启动 Runner 74 | 75 | 安装好所有内容后,只需从命令行调用 selenium-side-runner,就可以运行测试。命令行参数之前保存的项目文件(参见[入门](getting-started.md#保存成果))。 76 | 77 | ```sh 78 | > selenium-side-runner /path/to/your-project.side 79 | ``` 80 | 81 | **注意:如果您有多个 `.side` 文件,则可以使用通配符(例如,`/path/to/*.side`)。** 82 | 83 | 当您运行此命令时,它将在多个浏览器窗口中并行启动测试,分布在各个 `n` 进程上(`n` 是您的计算机上可用 CPU 核心数)。 84 | 85 | 进程数(以及其他内容)是可以在运行时配置的, 86 | 87 | **注意:并行执行是在套件级别上自动执行的。如果您希望套件内的测试并行执行,则需要更改设置。有关详细信息,请参阅[套件内的测试并行化](command-line-runner.md#在套件中测试并行化)。** 88 | 89 | ## 运行时配置 90 | 91 | 使用运行器,您可以在运行时传递不同的配置参数。 92 | 93 | ### 在本地不同的浏览器上运行测试 94 | 95 | 运行时配置的最常见用途是为本地测试执行指定不同的浏览器。 96 | 97 | ```sh 98 | selenium-side-runner -c "browserName=chrome" 99 | selenium-side-runner -c "browserName='internet explorer'" 100 | selenium-side-runner -c "browserName=edge" 101 | selenium-side-runner -c "browserName=firefox" 102 | selenium-side-runner -c "browserName=safari" 103 | ``` 104 | 105 | **注意:在本地运行测试时,每个浏览器都需要进行一些设置。有关详细信息,请参阅[安装浏览器驱](command-line-runner.md#安装浏览器驱动程序)** 106 | 107 | ### 在 Selenium Grid 上运行 108 | 109 | 要在 Grid 上运行测试(例如,您自己的 Grid 或 Sauce Labs 等托管服务提供商),您可以指定它的不同功能。 110 | 111 | ```sh 112 | selenium-side-runner --server http://localhost:4444/wd/hub -c "browserName='internet explorer' version='11.0' platform='Windows 8.1'" 113 | ``` 114 | 115 | `--server` 指定 Grid 的 URL,以及 `-c` 您希望 Grid 使用的功能。 116 | 117 | 您可以在[此处](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities)查看可用功能的完整列表。 118 | 119 | ### 指定并行进程数 120 | 121 | 在 Grid 上运行时,您可能希望控制正在运行的并行会话数。为此,您可以使用 `-w n` 命令参数(其中 `n` 是您想要的进程数)。 122 | 123 | ```sh 124 | selenium-side-runner -w 10 --server http://localhost:4444/wd/hub 125 | ``` 126 | 127 | 运行器将自动将工作器数设置为计算机上可用的相同 CPU 核心数。在大多数情况下,这是最好的选择。 128 | 129 | ### Chrome 专用功能 130 | 131 | 如果您在计算机上的非标准位置安装了 Chrome,则可以指定路径,以便 ChromeDriver 知道要查看的位置。 132 | 133 | ```sh 134 | selenium-side-runner -c "chromeOptions.binary='/path/to/non-standard/Chrome/install'" 135 | ``` 136 | 137 | 借助 Chrome 特定功能,您还可以无头地运行测试。 138 | 139 | ```sh 140 | selenium-side-runner -c "chromeOptions.args=[disable-infobars, headless]" 141 | ``` 142 | 143 | ## 触手可及的框架 144 | 145 | 还有其他细节与 Runner 一起开箱即用。您希望在传统的测试自动化框架中可以获得的东西。 146 | 147 | ### 更改基本 URL 148 | 149 | 通过指定不同的基本 URL,您可以轻松地将测试指向不同的环境(例如,本地开发,测试,升级,生产)。 150 | 151 | ```sh 152 | selenium-side-runner --base-url https://localhost 153 | ``` 154 | 155 | ### 过滤测试 156 | 157 | 您还可以选择使用 `--filter target` 命令标志(其中 `target` 是正则表达式值)运行测试的目标子集。包含给定搜索条件的测试名称将是唯一运行的名称。 158 | 159 | ```sh 160 | selenium-side-runner --filter smoke 161 | ``` 162 | 163 | ### 将测试结果输出到文件 164 | 165 | 如果需要将测试结果导出到文件(例如,作为 CI 过程的一部分运行时),可以组合使用 `--output-directory` 和 `--output-format` 命令行参数。 166 | 167 | `--output-directory` 定义放置测试结果文件的位置。它可以采用绝对路径或相对路径。 168 | 169 | `--output-format` 定义用于测试结果文件的格式。它可以是 `jest`(例如,JSON)或 `junit`(例如,XML)。默认格式是 `jest`(例如,如果您未指定类型)。 170 | 171 | ```sh 172 | selenium-side-runner --output-directory=results 173 | # Outputs results in `jest` frormat in `./results/projectName.json' 174 | ``` 175 | ```sh 176 | selenium-side-runner --output-directory=results --output-format=jest 177 | # Outputs results in `jest` frormat in `./results/projectName.json' 178 | ``` 179 | ```sh 180 | selenium-side-runner --output-directory=results --output-format=junit 181 | # Outputs results in `junit` frormat in `./results/projectName.xml' 182 | ``` 183 | 184 | ### 指定默认配置 185 | 186 | 您可以将运行时参数存储在配置文件中,而不是记住所需的所有命令行参数(可能变得难以操作)。 187 | 188 | 您可以使用两种配置文件。 189 | 190 | #### 选项 1 191 | 192 | 在您将运行测试的目录中创建一个 `.side.yml` 文件。Runner 将自动使用它。以下是文件内容的示例。 193 | 194 | ```yaml 195 | capabilities: 196 | browserName: "firefox" 197 | baseUrl: "https://www.seleniumhq.org" 198 | server: "http://localhost:4444/wd/hub" 199 | ``` 200 | 201 | 如果要忽略该文件并使用命令行参数,--no-sideyml 请在运行时与其他命令一起使用。 202 | 203 | #### 选项 2 204 | 205 | 除了使用 `.side.yml` 文件之外,您还可以在 YAML 文件中指定运行时参数,其中包含您选择的名称和位置,然后在运行测试时指定其位置。 206 | 207 | ```sh 208 | selenium-side-runner --config-file "/path/to/your/config.yaml" 209 | ``` 210 | 211 | **注意:使用 `--config-file` 参数时,`.side.yml` 将被忽略。** 212 | 213 | ## Selenium IDE 配置 214 | 215 | ### 在套件中测试并行化 216 | 217 | 默认情况下,运行器并行执行套件,但套件内的测试按顺序执行。 218 | 219 | 要并行运行给定套件中的测试,您需要在 Selenium IDE 中更新该套件的设置。 220 | 221 | 1. 切换到 `Selenium IDE` 中 `Test Suites` 的视图 222 | 2. 单击要配置的套件名称旁边的下拉菜单,然后单击 `Settings` 223 | 3. 单击复选框 `Run in parallel` 224 | 4. 点击 `Submit` 225 | 5. 保存您的 Selenium IDE 项目文件 226 | 227 | 要以这种方式配置多个套件,请在每个套件中重复步骤 1-4。一旦完成,请务必保存项目文件。 228 | 229 | ## 高级选项 230 | 231 | ### 额外的参数 232 | 233 | Selenium IDE 的插件可以指定自己独特的运行时参数。你可以通过 `--params` 参数使用它们。 234 | 235 | 此选项采用各种选项的字符串(类似于您指定功能的方式)。 236 | 237 | #### 基本用法 238 | 239 | 您可以指定参数的名称及其值。最基本的方法是指定一个字符串值。 240 | 241 | ```sh 242 | selenium-side-runner --params "a='example-value'" 243 | ``` 244 | 245 | #### 嵌套参数 246 | 247 | 参数也可以使用点表示法嵌套。 248 | 249 | ```sh 250 | selenium-side-runner --params "a.b='another example-value'" 251 | ``` 252 | 253 | #### 数组值 254 | 255 | 除了字符串之外,您还可以指定字母/数字值数组。 256 | 257 | ```sh 258 | selenium-side-runner --params "a.b.c=[1,2,3]" 259 | ``` 260 | 261 | #### 多个参数 262 | 263 | `--params` 只能调用一次,但您可以通过空格符分隔指定多个参数。 264 | 265 | ```sh 266 | selenium-side-runner --params "a='example-value' a.b='another example-value' a.b.c=[1,2,3]" 267 | ``` 268 | 269 | ### 使用代理服务器 270 | 271 | 您可以使用 runner 中的以下选项将代理功能传递给浏览器。 272 | 273 | #### 直接代理 274 | 275 | 此选项将 WebDriver 配置为绕过所有浏览器代理。 276 | 277 | ##### 从命令行: 278 | 279 | ```sh 280 | > selenium-side-runner --proxy-type=direct 281 | ``` 282 | 283 | ##### 在 `.side.yaml`: 284 | 285 | ```yaml 286 | proxyType: direct 287 | ``` 288 | 289 | #### 手动代理 290 | 291 | 手动配置浏览器代理。 292 | 293 | ###### 从命令行: 294 | 295 | ```sh 296 | selenium-side-runner --proxy-type=manual --proxy-options="http=localhost:434 bypass=[http://localhost:434, http://localhost:8080]" 297 | ``` 298 | 299 | ##### 在 `.side.yaml`: 300 | 301 | ```yaml 302 | proxyType: manual 303 | proxyOptions: 304 | http: http://localhost:434 305 | https: http://localhost:434 306 | ftp: http://localhost:434 307 | bypass: 308 | - http://localhost:8080 309 | - http://host:434 310 | - http://somethingelse:32 311 | ``` 312 | 313 | #### PAC代理 314 | 315 | 配置 WebDriver 以使用给定 URL 处的 PAC 文件设置浏览器代理。 316 | 317 | ##### 从命令行: 318 | 319 | ```sh 320 | selenium-side-runner --proxy-type=pac --proxy-options="http://localhost/pac" 321 | ``` 322 | 323 | ##### 在 `.side.yaml`: 324 | 325 | ```yaml 326 | proxyType: pac 327 | proxyOptions: http://localhost/pac 328 | ``` 329 | 330 | #### SOCKS 代理 331 | 332 | 为 SOCKS 代理创建代理配置。 333 | 334 | ##### 从命令行: 335 | 336 | ```sh 337 | selenium-side-runner --proxy-type=socks --proxy-options="socksProxy=localhost:434 socksVersion=5" 338 | ``` 339 | 340 | ##### 在 `.side.yaml`: 341 | 342 | ```sh 343 | proxyType: socks 344 | proxyOptions: 345 | socksProxy: localhost:434 346 | socksVersion: 5 347 | ``` 348 | 349 | #### 系统代理 350 | 351 | 配置 WebDriver 以使用当前系统的代理。 352 | 353 | ##### 从命令行: 354 | 355 | ```sh 356 | selenium-side-runner --proxy-type=system 357 | ``` 358 | 359 | ##### 在 `.side.yaml`: 360 | 361 | ```yaml 362 | proxyType: system 363 | ``` 364 | 365 | ### 代码导出 366 | 367 | 如果您正在尝试学习如何将记录的测试转换为 WebDriver 代码,或者您希望将记录的测试集成到现有的自定义测试框架中,那么您需要的是代码导出,现在可用于所选语言。你可以在这里了解更多! 368 | -------------------------------------------------------------------------------- /3.9/commands.md: -------------------------------------------------------------------------------- 1 | # 命令 2 | 3 | ## `add selection` 4 | 5 | 将选择添加到多选元素中的选项集。 6 | 7 | **参数** 8 | 9 | - locator:元素定位器。 10 | 11 | --- 12 | ## `answer on next prompt` 13 | 14 | 影响下一个警报提示。此命令将向其发送指定的答案字符串。如果警报已存在,则改为使用 “webdriver answer on visible prompt”。 15 | 16 | **参数** 17 | 18 | - answer:给出响应弹出提示的答案。 19 | 20 | --- 21 | ## `assert` 22 | 23 | 检查变量是否为预期值。变量的值将转换为字符串以进行比较。如果断言失败,测试将停止。 24 | 25 | **参数** 26 | 27 | - variable name:不带括号的变量名。 28 | - expected value:您期望变量包含的结果(例如,`true`,`false` 或其他值)。 29 | 30 | --- 31 | ## `assert alert` 32 | 33 | 断定已弹出包含指定文本的警告弹框。如果断言失败,测试将停止。 34 | 35 | **参数** 36 | 37 | - alert text:要检查的文本 38 | 39 | --- 40 | ## `assert checked` 41 | 42 | 断定目标元素已经勾选。如果断言失败,测试将停止。 43 | 44 | **参数** 45 | 46 | - locator:元素定位器。 47 | 48 | --- 49 | ## `assert confirmation` 50 | 51 | 断定已弹出确认弹框。如果断言失败,测试将停止。 52 | 53 | --- 54 | ## `assert editable` 55 | 56 | 断定目标元素是可编辑的。如果断言失败,测试将停止。 57 | 58 | **参数** 59 | 60 | - locator:元素定位器。 61 | 62 | --- 63 | ## `assert element present` 64 | 65 | 确认目标元素存在于页面的某个位置。如果断言失败,测试将停止。 66 | 67 | **参数** 68 | 69 | - locator:元素定位器。 70 | 71 | --- 72 | ## `assert element not present` 73 | 74 | 断定目标元素不在页面的任何位置。如果断言失败,测试将停止。 75 | 76 | **参数** 77 | 78 | - locator:元素定位器。 79 | 80 | --- 81 | ## `assert not checked` 82 | 83 | 断定目标元素没有被勾选。如果断言失败,测试将停止。 84 | 85 | **参数** 86 | 87 | - locator:元素定位器。 88 | 89 | --- 90 | ## `assert not editable` 91 | 92 | 断定目标元素不可编辑。如果断言失败,测试将停止。 93 | 94 | **参数** 95 | 96 | - locator:元素定位器。 97 | 98 | --- 99 | ## `assert not selected value` 100 | 101 | 断定下拉框中不包含属性值为 value 的选项。如果断言失败,测试将停止。 102 | 103 | **参数** 104 | 105 | - select locator:标识下拉菜单的元素定位器。 106 | - text:精确的字符串匹配。对模式匹配的支持正在进行中。有关详细信息,请参阅 https://github.com/SeleniumHQ/selenium-ide/issues/141 107 | 108 | --- 109 | ## `assert not text` 110 | 111 | 断定元素的文本不包含提供的值。如果断言失败,测试将停止。 112 | 113 | **参数** 114 | 115 | - locator:元素定位器。 116 | - text:精确的字符串匹配。对模式匹配的支持正在进行中。有关详细信息,请参阅 https://github.com/SeleniumHQ/selenium-ide/issues/141 117 | 118 | --- 119 | ## `assert prompt` 120 | 121 | 断定已弹出 JavaScript 提示弹框。如果断言失败,测试将停止。 122 | 123 | --- 124 | ## `assert selected value` 125 | 126 | 断定下拉框中包含属性值为 value 的选项。如果断言失败,测试将停止。 127 | 128 | **参数** 129 | 130 | - select locator:标识下拉菜单的元素定位器。 131 | - text:精确的字符串匹配。对模式匹配的支持正在进行中。有关详细信息,请参阅 https://github.com/SeleniumHQ/selenium-ide/issues/141 132 | 133 | --- 134 | ## `assert selected label` 135 | 136 | 断定下拉框中包含指定标签的选项。如果断言失败,测试将停止。 137 | 138 | **参数** 139 | 140 | - select locator:标识下拉菜单的元素定位器。 141 | - text:精确的字符串匹配。对模式匹配的支持正在进行中。有关详细信息,请参阅 https://github.com/SeleniumHQ/selenium-ide/issues/141 142 | 143 | --- 144 | ## `assert text` 145 | 146 | 断定元素的文本中包含提供的值。如果断言失败,测试将停止。 147 | 148 | **参数** 149 | 150 | - locator:元素定位器。 151 | - text:精确的字符串匹配。对模式匹配的支持正在进行中。有关详细信息,请参阅 https://github.com/SeleniumHQ/selenium-ide/issues/141 152 | 153 | --- 154 | ## `assert title` 155 | 156 | 断定当前页面的标题包含提供的文本。如果断言失败,测试将停止。 157 | 158 | **参数** 159 | 160 | - text:精确的字符串匹配。对模式匹配的支持正在进行中。有关详细信息,请参阅 https://github.com/SeleniumHQ/selenium-ide/issues/141 161 | 162 | --- 163 | ## `assert value` 164 | 165 | 断定输入字段(或带有值参数的任何其他内容)的(空白修剪)值。对于复选框/单选元素,该值将为 “on” 或 “off”,具体取决于是否选中了元素。如果断言失败,测试将停止。 166 | 167 | **参数** 168 | 169 | - locator:元素定位器。 170 | - text:精确的字符串匹配。对模式匹配的支持正在进行中。有关详细信息,请参阅 https://github.com/SeleniumHQ/selenium-ide/issues/141 171 | 172 | --- 173 | ## `check` 174 | 175 | 检查切换按钮(复选框/单选框)。 176 | 177 | **参数** 178 | 179 | - locator:元素定位器。 180 | 181 | --- 182 | ## `choose cancel on next confirmation` 183 | 184 | 影响下一个确认提醒。此命令将取消它。如果警报已存在,则使用 “webdriver 选择取消可见确认”代替。 185 | 186 | --- 187 | ## `choose cancel on next prompt` 188 | 189 | 影响下一个警报提示。此命令将取消它。如果警报已存在,则使用 “webdriver 在可见提示上选择取消”。 190 | 191 | --- 192 | ## `choose ok on next confirmation` 193 | 194 | 影响下一个确认提醒。该命令将接受它。如果警报已存在,则使用 “webdriver 在可见确认时选择确定”。 195 | 196 | --- 197 | ## `click` 198 | 199 | 单击目标元素(例如,链接,按钮,复选框或单选按钮)。 200 | 201 | **参数** 202 | 203 | - locator:元素定位器。 204 | 205 | --- 206 | ## `click at` 207 | 208 | 单击目标元素(例如,链接,按钮,复选框或单选按钮)。坐标相对于目标元素(例如,0,0 是元素的左上角),并且主要用于检查在它们上传递的效果,例如材料波纹效应。 209 | 210 | **参数** 211 | 212 | - locator:元素定位器。 213 | - coord string:指定鼠标事件相对于从定位器找到的元素的 `x`,`y` 位置(例如,10, 20)。 214 | 215 | --- 216 | ## `close` 217 | 218 | 关闭当前窗口。无需关闭初始窗口,IDE 将重新使用它; 关闭它可能会导致测试性能下降。 219 | 220 | --- 221 | ## `debugger` 222 | 223 | 中断执行并进入调试器 224 | 225 | --- 226 | ## `do` 227 | 228 | 创建一个至少执行一次前进命令的循环。使用 repeat if 命令终止分支。 229 | 230 | --- 231 | ## `double click` 232 | 233 | 双击元素(例如,链接,按钮,复选框或单选按钮)。 234 | 235 | **参数** 236 | 237 | - locator:元素定位器。 238 | 239 | --- 240 | ## `double click at` 241 | 242 | 双击目标元素(例如,链接,按钮,复选框或单选按钮)。坐标相对于目标元素(例如,0,0 是元素的左上角),并且主要用于检查在它们上传递的效果,例如材料波纹效应。 243 | 244 | **参数** 245 | 246 | - locator:元素定位器。 247 | - coord string:指定鼠标事件相对于从定位器找到的元素的 `x`,`y` 位置(例如,10, 20)。 248 | 249 | --- 250 | ## `drag and drop to object` 251 | 252 | 拖动一个元素并将其放在另一个元素上。 253 | 254 | **参数** 255 | 256 | - locator of object to be dragged:要拖动的元素的定位器。 257 | - locator of drag destination object:元素的定位符,其位置(例如,其中最中心的像素)将是要拖动的对象的定位符被丢弃的点。 258 | 259 | --- 260 | ## `echo` 261 | 262 | 将指定的消息打印到 Selenese 表中的第三个表格单元格中。对调试很有用。 263 | 264 | **参数** 265 | 266 | - message:要打印的消息。 267 | 268 | --- 269 | ## `edit content` 270 | 271 | 设置内容可编辑元素的值,就像您键入内容一样。 272 | 273 | **参数** 274 | 275 | - locator:元素定位器。 276 | - value:要键入的值。 277 | 278 | --- 279 | ## `else` 280 | 281 | if 块的一部分。当不满足 if 和/或 if 条件时,执行此分支中的命令。使用end 命令终止分支。 282 | 283 | --- 284 | ## `else if` 285 | 286 | if 块的一部分。如果未满足 if 条件,则执行此分支中的命令。使用 end 命令终止分支。 287 | 288 | **参数** 289 | 290 | - conditional expression:返回布尔结果的 JavaScript 表达式,用于控制流命令。 291 | 292 | --- 293 | ## `end` 294 | 295 | 终止 if,while 和 times 的控制流程块。 296 | 297 | --- 298 | ## `execute script` 299 | 300 | 在当前选定的框架或窗口的上下文中执行JavaScript片段。脚本片段将作为匿名函数的主体执行。要存储返回值,请使用“return”关键字并在值输入字段中提供变量名称。 301 | 302 | **参数** 303 | 304 | - script:要运行的 JavaScript 代码段。 305 | - variable name:不带括号的变量名。 306 | 307 | --- 308 | ## `execute async script` 309 | 310 | 在当前选定的框架或窗口的上下文中执行 JavaScript 的异步片段。脚本片段将作为匿名函数的主体执行,并且必须返回 Promise。如果您使用 'return' 关键字,则 Promise 结果将保存在变量中。 311 | 312 | **参数** 313 | 314 | - script:要运行的 JavaScript 代码段。 315 | - variable name::不带括号的变量名。 316 | 317 | --- 318 | ## `for each` 319 | 320 | 创建一个循环,为给定集合中的每个项执行前进命令。 321 | 322 | **参数** 323 | 324 | - array variable name:包含 JavaScript 数组的变量的名称。 325 | - iterator variable name:在循环控制流命令中迭代集合时使用的变量的名称(例如,对于每个)。 326 | 327 | --- 328 | ## `if` 329 | 330 | 在测试中创建条件分支。使用 end 命令终止分支。 331 | 332 | **参数** 333 | 334 | - conditional expression:返回布尔结果的 JavaScript 表达式,用于控制流命令。 335 | 336 | --- 337 | ## `mouse down` 338 | 339 | 模拟用户按下鼠标左键(尚未释放)。 340 | 341 | **参数** 342 | 343 | - locator:元素定位器。 344 | 345 | --- 346 | ## `mouse down at` 347 | 348 | 模拟用户在指定位置按下鼠标左键(尚未释放)。 349 | 350 | **参数** 351 | 352 | - locator:元素定位器。 353 | - coord string:指定鼠标事件相对于从定位器找到的元素的 `x`,`y` 位置(例如,10, 20)。 354 | 355 | --- 356 | ## `mouse move at` 357 | 358 | 模拟用户在指定元素上按下鼠标按钮(尚未释放它)。 359 | 360 | **参数** 361 | 362 | - locator:元素定位器。 363 | - coord string:指定鼠标事件相对于从定位器找到的元素的 `x`,`y` 位置(例如,10, 20)。 364 | 365 | --- 366 | ## `mouse out` 367 | 368 | 模拟用户将鼠标指针移离指定元素。 369 | 370 | **参数** 371 | 372 | - locator:元素定位器。 373 | 374 | --- 375 | ## `mouse over` 376 | 377 | 模拟将鼠标悬停在指定元素上的用户。 378 | 379 | **参数** 380 | 381 | - locator:元素定位器。 382 | 383 | --- 384 | ## `mouse up` 385 | 386 | 模拟用户释放鼠标按钮时发生的事件(例如,停止按住按钮)。 387 | 388 | **参数** 389 | 390 | - locator:元素定位器。 391 | 392 | --- 393 | ## `mouse up at` 394 | 395 | 模拟用户在指定位置释放鼠标按钮(例如,停止按住按钮)时发生的事件。 396 | 397 | **参数** 398 | 399 | - locator:元素定位器。 400 | - coord string:指定鼠标事件相对于从定位器找到的元素的 `x`,`y` 位置(例如,10, 20)。 401 | 402 | --- 403 | ## `open` 404 | 405 | 打开 URL 并等待页面加载后再继续。它接受相对和绝对 URL。 406 | 407 | **参数** 408 | 409 | - url:要打开的 URL(可以是相对的或绝对的)。 410 | 411 | --- 412 | ## `pause` 413 | 414 | 等待指定的时间。 415 | 416 | **参数** 417 | 418 | - wait time:等待的时间量(以毫秒为单位)。 419 | 420 | --- 421 | ## `remove selection` 422 | 423 | 使用选项定位器从多选元素中的选定选项集中删除选择。 424 | 425 | **参数** 426 | 427 | - locator:元素定位器。 428 | - option:选项定位器,通常只是一个选项标签(例如 “John Smith”)。 429 | 430 | --- 431 | ## `repeat if` 432 | 433 | 有条件地终止 'do' 控制流分支。如果提供的条件表达式的结果为 `true`,则启动 `do` 循环。否则它结束循环。 434 | 435 | **参数** 436 | 437 | - conditional expression:返回布尔结果的 JavaScript 表达式,用于控制流命令。 438 | 439 | --- 440 | ## `run` 441 | 442 | 从当前项目运行测试用例。 443 | 444 | **参数** 445 | 446 | - test case:项目中的测试用例名称。 447 | 448 | --- 449 | ## `run script` 450 | 451 | 在当前测试窗口的主体中创建一个新的 “script” 标记,并将指定的文本添加到命令的主体中。请注意,这些脚本标记中抛出的 JS 异常不由 Selenium 管理,因此如果脚本有可能抛出异常,您应该将脚本包装在 try/catch 块中。 452 | 453 | **参数** 454 | 455 | - script:要运行的 JavaScript 代码段。 456 | 457 | --- 458 | ## `select` 459 | 460 | 使用选项定位器从下拉菜单中选择元素。选项定位器提供指定选择元素的不同方式(例如,label =,value =,id =,index =)。如果未提供选项定位器前缀,则将尝试匹配标签。 461 | 462 | **参数** 463 | 464 | - select locator:标识下拉菜单的元素定位器。 465 | - option:选项定位器,通常只是一个选项标签(例如 “John Smith”)。 466 | 467 | --- 468 | ## `select frame` 469 | 470 | 选择当前窗口中的帧。您可以多次调用此命令以选择嵌套帧。注意:要选择父框架,请使用 “relative = parent” 作为定位器。要选择顶部框架,请使用 “relative = top”。您还可以通过其基于 0 的索引号选择帧(例如,选择带有 “index = 0” 的第一帧,或选择带有 “index = 2” 的第三帧)。 471 | 472 | **参数** 473 | 474 | - locator:元素定位器。 475 | 476 | --- 477 | ## `select window` 478 | 479 | 使用窗口定位器选择弹出窗口。一旦选择了弹出窗口,所有命令都将转到该窗口。窗口定位器使用句柄来选择窗口。 480 | 481 | **参数** 482 | 483 | - window handle:表示特定页面(选项卡或窗口)的句柄。 484 | 485 | --- 486 | ## `send keys` 487 | 488 | 模拟指定元素上的击键事件,就像您按键键入值一样。这模拟真实用户键入指定字符串中的每个字符; 它也受到真实用户的限制,例如无法输入不可见或只读元素。这对需要显式键事件的动态UI小部件(如自动完成组合框)很有用。与简单的“type”命令不同,该命令将指定的值直接强制进入页面,此命令不会替换现有内容。 489 | 490 | **参数** 491 | 492 | - locator:元素定位器。 493 | - key sequence:键入的键序列,可用于发送键击(例如:${KEY_ENTER})。 494 | 495 | --- 496 | ## `set speed` 497 | 498 | 设置执行速度(例如,设置每个 Selenium 操作之后的延迟的毫秒长度)。默认情况下,没有这样的延迟,例如,延迟是0毫秒。此设置是全局的,将影响所有测试运行,直到更改为止。 499 | 500 | **参数** 501 | 502 | - wait time:等待的时间量(以毫秒为单位)。 503 | 504 | --- 505 | ## `set window size` 506 | 507 | 设置浏览器的窗口大小,包括浏览器的界面。 508 | 509 | **参数** 510 | 511 | - resolution:使用 Width x Height 指定窗口分辨率。(例如,1280 x 800)。 512 | 513 | --- 514 | ## `store` 515 | 516 | 将目标字符串保存为变量以便于重复使用。 517 | 518 | **参数** 519 | 520 | - text:要验证的文本。 521 | - variable name:不带括号的变量名。 522 | 523 | --- 524 | ## `store attribute` 525 | 526 | 获取元素属性的值。不同浏览器的属性值可能不同(例如,“style” 属性就是这种情况)。 527 | 528 | **参数** 529 | 530 | - attribute locator:一个元素定位符,后跟一个 @ 符号,然后是属性的名称,例如 “foo @ bar”。 531 | - variable name:不带括号的变量名。 532 | 533 | --- 534 | ## `store json` 535 | 536 | 未定义 537 | 538 | **参数** 539 | 540 | - json:JavaScript 对象的字符串表示形式。 541 | - variable name:不带括号的变量名。 542 | 543 | --- 544 | ## `store text` 545 | 546 | 获取元素的文本并将其存储以供以后使用。这适用于包含文本的任何元素。 547 | 548 | **参数** 549 | 550 | - locator:元素定位器。 551 | - variable name:不带括号的变量名。 552 | 553 | --- 554 | ## `store title` 555 | 556 | 获取当前页面的标题。 557 | 558 | **参数** 559 | 560 | - variable name:不带括号的变量名。 561 | 562 | --- 563 | ## `store value` 564 | 565 | 获取元素的值并将其存储以供以后使用。这适用于任何输入类型元素。 566 | 567 | **参数** 568 | 569 | - locator:元素定位器。 570 | - variable name:不带括号的变量名。 571 | 572 | --- 573 | ## `store window handle` 574 | 575 | 获取当前页面的句柄。 576 | 577 | **参数** 578 | 579 | - window handle:表示特定页面(选项卡或窗口)的句柄。 580 | 581 | --- 582 | ## `store xpath count` 583 | 584 | 获取与指定的 xpath 匹配的节点数(例如,“//table” 将给出表的数量)。 585 | 586 | **参数** 587 | 588 | - xpath:要评估的xpath表达式。 589 | - variable name:不带括号的变量名。 590 | 591 | --- 592 | ## `submit` 593 | 594 | 提交指定的表格。这对于没有提交按钮的表单特别有用,例如单输入“搜索”表单。 595 | 596 | **参数** 597 | 598 | - form locator:您要提交的表单的元素定位器。 599 | 600 | --- 601 | ## `times` 602 | 603 | 创建一个循环,执行多次执行命令。 604 | 605 | **参数** 606 | 607 | - times:一次控制流循环的次数将执行其块内的命令。 608 | - loop limit:一个可选参数,指定循环控制流命令可以执行的最大次数。这可以防止无限循环。默认值设置为 1000。 609 | 610 | --- 611 | ## `type` 612 | 613 | 设置输入字段的值,就像输入字段一样。也可以用来设置组合框的值,复选框等。在这些情况下,值应该是所选选项的值,而不是可见文本。仅限 Chrome:如果指定了文件路径,则会将其上传到输入(对于 type = file),注意:不支持XPath定位器。 614 | 615 | **参数** 616 | 617 | - locator:元素定位器。 618 | - value:要键入的值。 619 | 620 | --- 621 | ## `uncheck` 622 | 623 | 取消选中切换按钮(复选框/单选框)。 624 | 625 | **参数** 626 | 627 | - locator:元素定位器。 628 | 629 | --- 630 | ## `verify` 631 | 632 | Soft断言变量是期望值。变量的值将转换为字符串以进行比较。即使验证失败,测试仍将继续。 633 | 634 | **参数** 635 | 636 | - variable name:不带括号的变量名。 637 | - expected value:您期望变量包含的结果(例如,true,false 或其他值)。 638 | 639 | --- 640 | ## `verify checked` 641 | 642 | 软断言已经检查了切换按钮(复选框/单选框)。即使验证失败,测试仍将继续。 643 | 644 | **参数** 645 | 646 | - locator:元素定位器。 647 | 648 | --- 649 | ## `verify editable` 650 | 651 | Soft断言指定的输入元素是否可编辑(例如,尚未禁用)。即使验证失败,测试仍将继续。 652 | 653 | **参数** 654 | 655 | - locator:元素定位器。 656 | 657 | --- 658 | ## `verify element present` 659 | 660 | 声明指定的元素在页面上的某个位置。即使验证失败,测试仍将继续。 661 | 662 | **参数** 663 | 664 | - locator:元素定位器。 665 | 666 | --- 667 | ## `verify element not present` 668 | 669 | 软断言指定的元素不在页面的某个位置。即使验证失败,测试仍将继续。 670 | 671 | **参数** 672 | 673 | - locator:元素定位器。 674 | 675 | --- 676 | ## `verify not checked` 677 | 678 | 软断言尚未检查切换按钮(复选框/单选框)。即使验证失败,测试仍将继续。 679 | 680 | **参数** 681 | 682 | - locator:元素定位器。 683 | 684 | --- 685 | ## `verify not editable` 686 | 687 | Soft断言指定的输入元素是否不可编辑(例如,尚未禁用)。即使验证失败,测试仍将继续。 688 | 689 | **参数** 690 | 691 | - locator:元素定位器。 692 | 693 | --- 694 | ## `verify not selected value` 695 | 696 | 声明未通过其 option 属性在选择菜单中选择了期望的元素。即使验证失败,测试仍将继续。 697 | 698 | **参数** 699 | 700 | - select locator:标识下拉菜单的元素定位器。 701 | 702 | --- 703 | ## `verify not text` 704 | 705 | 软断言元素的文本不存在。即使验证失败,测试仍将继续。 706 | 707 | **参数** 708 | 709 | - locator:元素定位器。 710 | - text:要验证的文本。 711 | 712 | --- 713 | ## `verify selected label` 714 | 715 | Soft声明指定 select 元素中所选选项的可见文本。即使验证失败,测试仍将继续。 716 | 717 | **参数** 718 | 719 | - select locator:标识下拉菜单的元素定位器。 720 | - text:精确的字符串匹配。对模式匹配的支持正在进行中。有关详细信息,请参阅 https://github.com/SeleniumHQ/selenium-ide/issues/141 721 | 722 | --- 723 | ## `verify selected value` 724 | 725 | Soft 声明已通过其 option 属性在选择菜单中选择了期望的元素。即使验证失败,测试仍将继续。 726 | 727 | **参数** 728 | 729 | - select locator:标识下拉菜单的元素定位器。 730 | 731 | --- 732 | ## `verify text` 733 | 734 | 软断言元素的文本存在。即使验证失败,测试仍将继续。 735 | 736 | **参数** 737 | 738 | - locator:元素定位器。 739 | - text:要验证的文本。 740 | 741 | --- 742 | ## `verify title` 743 | 744 | 软断言当前页面的标题包含提供的文本。即使验证失败,测试仍将继续。 745 | 746 | **参数** 747 | 748 | - text:要验证的文本。 749 | 750 | --- 751 | ## `verify value` 752 | 753 | 断言输入字段(或带有值参数的任何其他内容)的(空白修剪)值。对于复选框/单选元素,该值将为 “on” 或 “off”,具体取决于是否选中了元素。即使验证失败,测试仍将继续。 754 | 755 | **参数** 756 | 757 | - locator:元素定位器。 758 | - text:精确的字符串匹配。对模式匹配的支持正在进行中。有关详细信息,请参阅 https://github.com/SeleniumHQ/selenium-ide/issues/141 759 | 760 | --- 761 | ## `wait for element editable` 762 | 763 | 等待元素可编辑。 764 | 765 | **参数** 766 | 767 | - locator:元素定位器。 768 | - wait time:等待的时间量(以毫秒为单位)。 769 | 770 | --- 771 | ## `wait for element not editable` 772 | 773 | 等待元素不可编辑。 774 | 775 | **参数** 776 | 777 | - locator:元素定位器。 778 | - wait time:等待的时间量(以毫秒为单位)。 779 | 780 | --- 781 | ## `wait for element not present` 782 | 783 | 等待页面上不存在目标元素。 784 | 785 | **参数** 786 | 787 | - locator:元素定位器。 788 | - wait time:等待的时间量(以毫秒为单位)。 789 | 790 | --- 791 | ## `wait for element not visible` 792 | 793 | 等待目标元素在页面上不可见。 794 | 795 | **参数** 796 | 797 | - locator:元素定位器。 798 | - wait time:等待的时间量(以毫秒为单位)。 799 | 800 | --- 801 | ## `wait for element present` 802 | 803 | 等待页面上出现目标元素。 804 | 805 | **参数** 806 | 807 | - locator:元素定位器。 808 | - wait time:等待的时间量(以毫秒为单位)。 809 | 810 | --- 811 | ## `wait for element visible` 812 | 813 | 等待目标元素在页面上可见。 814 | 815 | **参数** 816 | 817 | - locator:元素定位器。 818 | - wait time:等待的时间量(以毫秒为单位)。 819 | 820 | --- 821 | ## `webdriver answer on visible prompt` 822 | 823 | 影响当前显示的警报提示。此命令指示 Selenium 为其提供指定的答案。如果警报尚未出现,则改为使用“在下一个提示时回答”。 824 | 825 | **参数** 826 | 827 | - answer:给出响应弹出提示的答案。 828 | 829 | --- 830 | ## `webdriver choose cancel on visible confirmation` 831 | 832 | 影响当前显示的确认警报。此命令指示 Selenium 取消它。如果警报尚未出现,请改为使用“在下次确认时选择取消”。 833 | 834 | --- 835 | ## `webdriver choose cancel on visible prompt` 836 | 837 | 影响当前显示的警报提示。此命令指示 Selenium 取消它。如果警报尚未出现,请改为使用“在下一个提示中选择取消”。 838 | 839 | --- 840 | ## `webdriver choose ok on visible confirmation` 841 | 842 | 影响当前显示的确认警报。此命令指示 Selenium 接受它。如果警报尚未出现,则使用“在下一次确认时选择确定”。 843 | 844 | --- 845 | ## `while` 846 | 847 | 只要提供的条件表达式为 true,就创建一个重复执行前进命令的循环。 848 | 849 | **参数** 850 | 851 | - conditional expression:返回布尔结果的 JavaScript 表达式,用于控制流命令。 852 | - loop limit:一个可选参数,指定循环控制流命令可以执行的最大次数。这可以防止无限循环。默认值设置为 1000。 853 | -------------------------------------------------------------------------------- /3.9/control-flow.md: -------------------------------------------------------------------------------- 1 | # 控制流 2 | 3 | Selenium IDE 附带了一些命令,可以让您添加条件逻辑以及循环到测试中。 4 | 5 | 这使您只有在满足应用程序中的某些条件时才执行命令(或一组命令),或者根据预定义的条件重复执行命令。 6 | 7 | ## JavaScript 表达式 8 | 9 | 使用 JavaScript 表达式检查应用程序中的条件。 10 | 11 | 您可以在测试期间的任何时候使用 `execute script` 或 `execute async script` 命令运行 `JavaScript` 代码段,并将结果存储在变量中。这些变量可用于控制流命令。 12 | 13 | 您还可以直接在控制流命令中使用 JavaScript 表达式。 14 | 15 | ## 可用命令 16 | 17 | 控制流命令通过指定打开和关闭命令来表示命令的集合(或块)。 18 | 19 | 以下是每个可用的控制流命令以及它们的伴随和/或关闭命令。 20 | 21 | - `if`,`else if`,`else`,`end` 22 | - `times`,`end` 23 | - `do`,`repeat if` 24 | - `while`,`end` 25 | 26 | 让我们逐步介绍每个例子。 27 | 28 | ## 条件分支 29 | 30 | 条件分支使您可以更改测试中的行为。 31 | 32 | ![if 示例,王顶,408542507@qq.com](https://www.seleniumhq.org/selenium-ide/img/docs/control-flow/if.png) 33 | 34 | ### [if](commands.md#if) 35 | 36 | 这是条件块的打开命令。 37 | 38 | 与此同时,您提供一个您想要评估的 JavaScript 表达式。这可以包含从测试中的先前 JavaScript 表达式创建的变量。这些都放在 `if` 命令的 `target` 字段。 39 | 40 | 如果该表达式评估为 `true` 则测试将执行它后面,直到下一个条件控制流命令命令(例如,`else if`,`else`,或 `end`)。 41 | 42 | 如果该表达式评估为 `false` 将跳过随后的命令和跳转到下一个相关条件控制流命令(例如,`else if`,`else`,或 `end`)。 43 | 44 | ### [else if](commands.md#else-if) 45 | 46 | 此命令在 `if` 命令块中使用。 47 | 48 | 类似 `if` 它在 `target` 输入字段中使用 JavaScript 表达式来评估,执行其后面的命令分支,或者跳到下一个相关的控制流命令(例如,`else` 或 `end`)。 49 | 50 | ### [else](commands.md#else) 51 | 52 | `else` 是你可以拥有的 `if` 块的最后一个条件。如果未满足任何先前条件,则将执行此命令分支。 53 | 54 | 完成后它将跳转到 `end` 命令。 55 | 56 | ### [end](commands.md#end) 57 | 58 | 该命令终止条件命令块。如果没有它,命令块将不完整,您将收到一条有用的错误消息,让您在尝试运行测试时知道。 59 | 60 | ## 循环 61 | 62 | 循环使您可以迭代给定的命令集。 63 | 64 | ### [times](commands.md#times) 65 | 66 | 有了 `times` 你可以指定一个迭代次数要执行的命令集。该数字进入命令的 `target` 输入字段 `times`。 67 | 68 | 要关闭 `times` 命令块,请务必使用 `end` 命令。 69 | 70 | ![times-example,王顶,408542507@qq.com](https://www.seleniumhq.org/selenium-ide/img/docs/control-flow/times.png) 71 | 72 | ### [do](commands.md#do) 73 | 74 | 使用 `do` 命令启动循环,然后是要执行的命令,并以 `repeat if` 命令结束。`repeat if` 获取您要在 `target` 字段中评估的 JavaScript 表达式。 75 | 76 | `do` 将首先执行之后的命令,然后评估 `repeat if` 中的条件表达式。如果表达式返回,`true` 则测试将跳回 `do` 命令并重复该序列。 77 | 78 | ![do-example,王顶,408542507@qq.com](https://www.seleniumhq.org/selenium-ide/img/docs/control-flow/do.png) 79 | 80 | 这将继续,直到条件返回 `false` 或触发无限循环保护————默认为 `1000` 次尝试。您可以通过在 `repeat if` 命令的 `value` 字段中指定数字来覆盖此默认值。 81 | 82 | ### [while](commands.md#while) 83 | 84 | 随 `while` 您提供要在 `target` 输入字段中评估的 JavaScript 表达式。如果它评估为 `true` 命令块,则执行该命令块直到它到达 `end` 命令。 85 | 86 | 完成后,测试将跳回到 `while` 命令并重复相同的序列(首先检查条件是否为 `true` 或 `false`)。 87 | 88 | 要关闭 `while` 命令块,请使用 `end` 命令。 89 | 90 | ![while-example,王顶,408542607@qq.com](https://www.seleniumhq.org/selenium-ide/img/docs/control-flow/while.png) 91 | 92 | 循环将重试,直到条件返回 `false` 或触发无限循环保护————默认为 `1000` 尝试。您可以通过在 `while` 命令的 `value` 字段中指定数字来覆盖此默认值。 93 | 94 | ### [forEach](commands.md#for-each) 95 | 96 | 保存最后的最佳,我们有能力迭代一个集合(例如,JS 数组),并在我们这样做时引用该集合中的每个项目。 97 | 98 | 在 `target` 字段中,您可以指定包含要迭代的数组的变量的名称。在 `value` 字段中,您可以指定要使用的迭代器变量的名称。对于数组中的每个条目,将执行后面的命令。在每次迭代期间,可以通过迭代器变量访问当前条目的内容。 99 | 100 | ![for-each-example,王顶,408542507@qq.com](https://www.seleniumhq.org/selenium-ide/img/docs/control-flow/for-each.png) 101 | 102 | ## 嵌套命令 103 | 104 | 您可以根据需要嵌套控制流命令(例如,`if` 块可以放在 `while` 块内,反之亦然)。 105 | 106 | ![nested-example,王顶,408542507@qq.com](https://www.seleniumhq.org/selenium-ide/img/docs/control-flow/nested.png) 107 | 108 | ## 语法验证 109 | 110 | 如果您不确定控制流语法是否正确,请尝试运行测试以查看。IDE 将发现控制流语法中的错误,并调出不正确或缺失的特定命令。 111 | 112 | ![error-example,王顶,408542407@qq.com](https://www.seleniumhq.org/selenium-ide/img/docs/control-flow/error.png) 113 | -------------------------------------------------------------------------------- /3.9/faq.md: -------------------------------------------------------------------------------- 1 | # 常见问题 2 | 3 | ## 我如何记录悬停? 4 | 5 | 鼠标悬停(aka 悬停)操作很难自动捕获,作为记录周期的一部分。 6 | 7 | 要在测试中添加悬停,需要进行一些手动干预。有两种不同的方法可以做到。 8 | 9 | *选项 1:录制时添加* 10 | 11 | 1. 录制时,右键单击要悬停在其上的元素 12 | 2. 从出现的菜单中单击 `Selenium IDE` 然后再单击 `Mouse Over` 13 | 3. 确认 `Mouse Over` 测试步骤位于测试中的正确位置(如果需要,将其拖放到其他位置) 14 | 15 | *选项 2:在测试编辑器中手动添加* 16 | 17 | 1. 右键单击 IDE 中的测试步骤 18 | 2. 选择 `Insert new command` 19 | 3. 输入 `mouse over` 到 `Command` 输入字段 20 | 4. 在 `Target` 输入字段中键入要悬停的定位器(或单击 `Select target in page` 并选择要悬停在其上的元素) 21 | 22 | ## 为什么键入日期输入字段的数字不正确显示? 23 | 24 | 通过 Selenium IDE 的命令行运行程序运行测试时,会出现此问题。 25 | 26 | 要绕过它,你需要启用 w3c 模式,你可以通过传递 `-c "chromeOptions.w3c=true"` 作为启动跑步者的一部分来做。 27 | 28 | 启用 w3c 模式可能会影响 Selenium Actions 的性能(如果您的测试最终使用它们),那么只有在日期输入字段出现问题时才使用此模式。 29 | 30 | ## 在继续之前,如何使 IDE 等待某个条件成立? 31 | 32 | 在某些情况下,IDE 中的内置等待策略是不够的。发生这种情况时,您可以使用其中一个可用的显式等待命令。 33 | 34 | - `wait for element editable` 35 | - `wait for element present` 36 | - `wait for element visible` 37 | - `wait for element not editable` 38 | - `wait for element not present` 39 | - `wait for element not visible` 40 | 41 | ## 如何在文本验证中使用正则表达式? 42 | 43 | 这是我们最终添加的功能(有关[详细信息](https://github.com/SeleniumHQ/selenium-ide/issues/141),请参阅问题 141)。作为一种变通方法,您可以使用 XPath 定位 `starts-with` 和 `contains` 关键字。 44 | 45 | | 命令 | 目标 | 值 | 46 | |---- | ---- | --- | 47 | | assertElementPresent | `//a@[starts-with(.,'you are the') and contains(., 'User to login today')]` | | 48 | 49 | ## 如何滚动? 50 | 51 | 在 Selenium IDE 中没有用于滚动的明确命令,因为在 Selenium 中没有实现。相反,您可以使用 `scrollTo` JavaScript 中的命令通过指定 `x` 和 `y` 滚动到的坐标来完成此操作。 52 | 53 | | 命令 | 目标 | 值 | 54 | |---- | ---- | --- | 55 | | executeScript | window.scrollTo(0, 1000)| | 56 | 57 | ## 保存文件 58 | 59 | ### 为什么我保存我的 SIDE 项目的位置不被记住? 60 | 61 | ### 为什么每次我想要保存项目时都需要单步执行“另存为”流程? 62 | 63 | ### 为什么我需要覆盖以前保存的文件? 64 | 65 | 所有这些问题都是同一问题的一部分 - 作为浏览器扩展,Selenium IDE 无法访问文件系统。提供“保存”功能的唯一方法是下载文件。当 IDE 移动到本机应用程序时,将解决此问题。这将为 IDE 首要文件系统提供访问权限,使其能够提供优质的“保存”体验。 66 | 67 | 如果您想保持更新,可以按照问题 363 进行操作。 68 | 69 | ## 如何在严格的代理/防火墙后面安装 IDE? 70 | 71 | 在某些情况下,您可能没有完整的公共 Internet 访问权限(例如“公司代理或防火墙”后面)。在这些环境中,您需要获取构建的 Selenium IDE ZIP 文件的副本,以便记录自动化测试脚本。这可以在 GitHub 的 “Releases” 部分找到: 72 | 73 | https://github.com/SeleniumHQ/selenium-ide/releases 74 | 75 | 并非所有版本都包含 “selenium-ide.zip”,因为有些版本只是“源代码”版本。查找具有此 zip 文件的最新版本。这意味着它是提交给 Chrome 和 Firefox 商店的最新版本。 76 | 77 | ### 官方签名版本 78 | 79 | 从项目发布页面下载 zip 文件为您提供了一个未签名的 ZIP 文件。或者,您可以获得正式签名的安装程序,这些安装程序可以更好地使用“安全环境”: 80 | 81 | - [Firefox 附加组件](https://addons.mozilla.org/en-US/firefox/addon/selenium-ide/) 82 | - [下载所需 “.xpi” 安装程序的说明](https://superuser.com/questions/646856/how-to-save-firefox-addons-for-offline-installation) 83 | 84 | **注意:如果您已经安装了插件(例如,在笔记本电脑上试图获取安装程序的副本),您只能在尝试访问它们时看到 REMOVE 按钮。因此,删除它们一次,让安装程序移动到另一台未连接的计算机,然后根据需要在主设备的浏览器中重新安装。** 85 | 86 | - [Chrome 商店](https://chrome.google.com/webstore/detail/selenium-ide/mooikfkahbdckldjjndioackbalphokd) 87 | - [下载所需“.crx”安装程序的说明](https://stackoverflow.com/questions/25480912/how-to-download-a-chrome-extension-without-installing-it) 88 | 89 | **注意:您无法直接从 Chrome 商店获取 “.crx” 文件。相反,您需要在本地安装一次,然后转到计算机上的安装目录以检索它。** 90 | 91 | ## 连接插件后为什么没有出现保存对话框? 92 | 93 | 由于当前的 [Chrome bug](https://bugs.chromium.org/p/chromium/issues/detail?id=922373),如果您不回复 Selenium IDE 发出的消息,则不会进行进一步处理。要解决此问题,请务必 `emit` 使用实体监听操作 `project` 并回复 `undefined`: 94 | 95 | ```javascript 96 | chrome.runtime.onMessageExternal.addListener((message, sender, sendResponse) => { 97 | if (message.action === "emit" && message.entity === "project") { 98 | sendResponse(undefined); 99 | } 100 | }); 101 | ``` 102 | -------------------------------------------------------------------------------- /3.9/getting-started.md: -------------------------------------------------------------------------------- 1 | # 入门 2 | 3 | ## 安装 4 | 5 | 从 Chrome 或 Firefox 商店安装 Selenium IDE。 6 | 7 | ## 启动 IDE 8 | 9 | 安装后,通过单击浏览器菜单栏中的图标启动它。 10 | 11 | ### 故障排除 12 | 13 | 在菜单栏中看不到 Selenium IDE 的图标? 14 | 15 | #### 选项 1 16 | 17 | 确保在浏览器的扩展设置中启用了 IDE。 18 | 19 | 您可以通过在地址栏中输入以下内容并点击 `Enter` 来快速到达那里。 20 | 21 | - Chrome:`chrome://extensions` 22 | - Firefox:`about:addons` 23 | 24 | #### 选项 2 25 | 26 | 可能已启用扩展程序但隐藏了图标。尝试调整菜单栏的大小以增加空间。 27 | 28 | 在 Chrome 中,您可以通过单击地址栏右侧,按住单击并向左或向右拖动来执行此操作。 29 | 30 | 在 Firefox 中,您需要右键单击,单击 `Customize`,调整菜单栏,然后单击 `Done`。 31 | 32 | ## 欢迎屏幕 33 | 34 | 启动 IDE 后,您将看到一个欢迎对话框。 35 | 36 | 这将使您可以快速访问以下选项: 37 | 38 | - 在新项目中记录新测试 39 | - 打开现有项目 40 | - 创建一个新项目 41 | - 关闭 IDE 42 | 43 | 如果这是您第一次使用 IDE(或者您正在开始一个新项目),请选择第一个选项。 44 | 45 | ## 记录您的第一次测试 46 | 47 | 创建新项目后,系统将提示您为其命名,然后要求提供基本 URL。基本 URL 是您正在测试的应用程序的 URL。只要设置一次,它就可以用于这个项目中的所有测试。如果需要,您也可以稍后更改。 48 | 49 | 完成这些设置后,将打开一个新的浏览器窗口,加载基本 URL 并开始录制。 50 | 51 | 与页面交互,您的每个操作都将记录在 IDE 中。要停止录制,请切换到 IDE 窗口并单击录制图标。 52 | 53 | ## 组织测试 54 | 55 | ### 测试 56 | 57 | 您可以通过单击左边栏菜单顶部的 `+` 符号(`Tests` 标题右侧),命名该测试,并单击 `ADD` 来添加新测试。 58 | 59 | 添加后,您可以手动输入命令,也可以单击 IDE 右上角的录制图标。 60 | 61 | ### 套件 62 | 63 | 测试可以组合成套件。 64 | 65 | 在项目创建时,`Default Suite` 会创建一个并自动添加第一个测试。 66 | 67 | 要创建和管理套件,请转到 `Test suites` 面板。您可以通过单击左边栏菜单顶部的下拉菜单(例如,单击单词 `Tests`)并选择 `Test suites`。 68 | 69 | #### 添加套件 70 | 71 | 要添加套件,请单击 `Test Suites` 标题右侧,左边栏菜单顶部的 `+` 符号,提供名称,然后单击 `ADD`。 72 | 73 | #### 添加测试 74 | 75 | 要将测试添加到测试套件中,请在测试套件名称上,执行以下操作: 76 | 77 | - 单击 `Test Suites` 标题右侧显示的图标 78 | - 点击 `Add tests` 79 | - 从菜单中选择要添加的测试 80 | - 点击 `Select` 81 | 82 | #### 删除测试 83 | 84 | 要删除测试,请将鼠标移到测试上,然后单击测试名称右侧的 `X`。 85 | 86 | #### 删除或重命名套件 87 | 88 | 要删除套件,请单击测试名称右侧显示的图标,单击 `Delete`,然后在后续提示中再次点击 `Delete`。 89 | 90 | 要重命名套件,将鼠标移动到套件名称上,单击名称右侧显示的图标,单击 `Rename`,更新名称,然后再单击 `RENAME`。 91 | 92 | ## 保存成果 93 | 94 | 要保存您刚刚在 IDE 中完成的所有操作,请单击 IDE 右上角的保存图标。 95 | 96 | 它将提示您输入保存项目的位置和名称。保存的最终结果是带 `.side` 扩展名的单个文件。 97 | 98 | ## 回放 99 | 100 | ### 浏览器里 101 | 102 | 您可以通过选择要播放的测试或套件并单击测试编辑器上方菜单栏中的播放按钮,在 IDE 中进行测试。 103 | 104 | 测试将在浏览器中回放。如果在录制完成后,浏览器窗口没有关闭,它将用于回放。否则,将打开并使用新的浏览器窗口。 105 | 106 | ### 跨浏览器 107 | 108 | 如果要在其他浏览器上运行 IDE 测试,请查看[命令行运行器](command-line-runner.md)。 109 | -------------------------------------------------------------------------------- /3.9/styles/website.css: -------------------------------------------------------------------------------- 1 | .image-wrapper { 2 | text-align: center; 3 | } 4 | -------------------------------------------------------------------------------- /CNAME: -------------------------------------------------------------------------------- 1 | selenium.wangding.co 2 | -------------------------------------------------------------------------------- /Gruntfile.js: -------------------------------------------------------------------------------- 1 | module.exports = function (grunt) { 2 | grunt.initConfig({ 3 | htmlmin: { 4 | options: { 5 | collapseWhitespace: true, 6 | preserveLineBreaks: false 7 | }, 8 | files: { 9 | expand: true, 10 | cwd: '_book', 11 | src: ['*.html', '2.9/*.html'], 12 | dest: 'dist/' 13 | } 14 | }, 15 | cssmin: { 16 | files: { 17 | expand: true, 18 | cwd: '_book', 19 | src: ['gitbook/**/*.css', '2.9/gitbook/**/*.css'], 20 | dest: 'dist/' 21 | } 22 | }, 23 | uglify: { 24 | main: { 25 | files: [{ 26 | expand: true, 27 | cwd: '_book', 28 | src: ['gitbook/**/*.js', '2.9/gitbook/**/*.js', '!gitbook/gitbook-plugin-anchor-navigation-ex/**/*.js', '!2.9/gitbook/gitbook-plugin-anchor-navigation-ex/**/*.js'], 29 | dest: 'dist/' 30 | }] 31 | } 32 | }, 33 | unescape: { 34 | files: { 35 | src: ['_book/*.html', '_book/2.9/*.html'], 36 | dist: 'dist/' 37 | } 38 | }, 39 | 'json-minify': { 40 | build: { 41 | files: 'book.json' 42 | } 43 | }, 44 | replace: { 45 | html: { 46 | src: ['_book/*.html', '_book/2.9/*.html'], 47 | overwrite: true, 48 | replacements: [{ 49 | form: '', 50 | to: '' 51 | }, { 52 | from: '', 53 | to: '' 54 | }] 55 | } 56 | }, 57 | qiniu_qupload: { 58 | default_options: { 59 | options: { 60 | ak: 'QINIU_AK', 61 | sk: 'QINIU_SK', 62 | bucket: 'gb-selenium', 63 | assets: [{src: '_book', prefix: ''}] 64 | } 65 | } 66 | }, 67 | copy: { 68 | html: { 69 | files: [{ 70 | expand: true, 71 | cwd: 'dist', 72 | src: ['*.html', '2.9/*.html'], 73 | dest: '_book/' 74 | }] 75 | }, 76 | js: { 77 | files: [{ 78 | expand: true, 79 | cwd: 'dist', 80 | src: ['gitbook/**', '2.9/gitbook/**'], 81 | dest: '_book/' 82 | }] 83 | } 84 | } 85 | }); 86 | 87 | grunt.loadNpmTasks('grunt-contrib-htmlmin'); 88 | grunt.loadNpmTasks('grunt-contrib-cssmin'); 89 | grunt.loadNpmTasks('grunt-contrib-uglify'); 90 | grunt.loadNpmTasks('grunt-contrib-copy'); 91 | grunt.loadNpmTasks('grunt-text-replace'); 92 | grunt.loadNpmTasks('grunt-unescape-html'); 93 | grunt.loadNpmTasks('grunt-json-minify'); 94 | grunt.loadNpmTasks('@wangding/grunt-qiniu-qupload'); 95 | 96 | grunt.registerTask('minify', ['unescape', 'copy:html', 'replace', 'htmlmin', 'cssmin', 'uglify', 'copy:html', 'copy:js', 'json-minify']); 97 | grunt.registerTask('upload', ['qiniu_qupload']); 98 | }; 99 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2016 王顶 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 简介 2 | 3 | Selenium IDE 是一款 web UI 自动化测试工具,是基于录制和回放操作的火狐浏览器的插件。本教程是官方资料的翻译。 4 | 5 | 如果不喜欢阅读文字教程,可以尝试学习 [Selenium IDE web 自动化测试视频课程](https://github.com/wangding/courses/blob/master/seleniumIDE/README.md),并完成相应的通关任务。 6 | 7 | -------------------------------------------------------------------------------- /book.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Selenium IDE 帮助文章", 3 | "discription": "Selenium IDE 帮助文章", 4 | "author": "王顶", 5 | "language": "zh-hans", 6 | "plugins": [ 7 | "-lunr", 8 | "-search", 9 | "-highlight", 10 | "-sharing", 11 | "edit-link", 12 | "forkmegithub-cn", 13 | "search-plus", 14 | "sharing-plus", 15 | "anchor-navigation-ex", 16 | "copy-code-button", 17 | "prism", 18 | "splitter", 19 | "image-captions-extended", 20 | "bsz", 21 | "fancybox", 22 | "image-wrapper", 23 | "gtalk", 24 | "versions-select" 25 | ], 26 | "pluginsConfig": { 27 | "versions": { 28 | "gitbookConfigURL": "http://selenium.wangding.co/book.json", 29 | "options": [ 30 | { 31 | "value": "http://selenium.wangding.co", 32 | "text": "v3.9" 33 | }, 34 | { 35 | "value": "http://selenium.wangding.co/2.9/", 36 | "text": "v2.9" 37 | }] 38 | }, 39 | "gtalk": { 40 | "clientID": "c0fb01d8974fad3f4b9e", 41 | "clientSecret": "14af1e32e0a8bedc62a6e3ce097ae2fc5e8cc1d8", 42 | "repo": "selenium-ide-doc", 43 | "owner": "wangding", 44 | "admin": ["wangding"], 45 | "labels": ["SeIDE"] 46 | }, 47 | "anchor-navigation-ex": { 48 | "multipleH1": false 49 | }, 50 | "forkmegithub-cn": { 51 | "url": "https://github.com/wangding/selenium-ide-doc", 52 | "color": "red" 53 | }, 54 | "edit-link": { 55 | "base": "https://github.com/wangding/selenium-ide-doc/blob/master/", 56 | "label": "编辑本页" 57 | }, 58 | "sharing": { 59 | "douban": true, 60 | "facebook": false, 61 | "google": false, 62 | "hatenaBookmark": false, 63 | "instapaper": false, 64 | "line": false, 65 | "linkedin": false, 66 | "messenger": false, 67 | "pocket": false, 68 | "qq": true, 69 | "qzone": true, 70 | "stumbleupon": false, 71 | "twitter": false, 72 | "viber": false, 73 | "vk": false, 74 | "weibo": true, 75 | "whatsapp": false, 76 | "all": [ 77 | "weibo", "douban", "qzone", "qq" 78 | ] 79 | }, 80 | "image-captions": { 81 | "caption": "图:_CAPTION_" 82 | }, 83 | "bsz": { 84 | "copyright": "2016 -  by 王顶. All rights reserved." 85 | } 86 | }, 87 | "styles": { 88 | "website": "styles/website.css" 89 | } 90 | } 91 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "selenium-ide-doc", 3 | "version": "2.0.0", 4 | "description": "Selenium IDE 帮助文档", 5 | "scripts": { 6 | "test": "echo \"nothing to test!\" && exit 0" 7 | }, 8 | "repository": { 9 | "type": "git", 10 | "url": "git+https://github.com/wangding/selenium-ide-doc.git" 11 | }, 12 | "author": "wangding", 13 | "license": "MIT", 14 | "bugs": { 15 | "url": "https://github.com/wangding/selenium-ide-doc/issues" 16 | }, 17 | "homepage": "https://github.com/wangding/selenium-ide-doc#readme", 18 | "devDependencies": { 19 | "@wangding/grunt-qiniu-qupload": "^0.2.1", 20 | "gitbook-cli": "^2.3.2", 21 | "grunt": "^1.0.1", 22 | "grunt-contrib-copy": "^1.0.0", 23 | "grunt-contrib-cssmin": "^3.0.0", 24 | "grunt-contrib-htmlmin": "^2.4.0", 25 | "grunt-contrib-uglify": "^4.0.1", 26 | "grunt-json-minify": "^1.1.0", 27 | "grunt-text-replace": "^0.4.0", 28 | "grunt-unescape-html": "0.0.5" 29 | } 30 | } 31 | --------------------------------------------------------------------------------