提交 8528d91a 编写于 作者: W wizardforcel

2020-06-25 12:48:11

上级 a497a91a
......@@ -8,7 +8,7 @@
因此,如果您可以集中精力并强调 Selenium 工具套件在这些方面的积极方面,那么您一定会品尝到成功的。 而这正是我要令您惊讶的地方。
每个人都喜欢听与故事相关的故事。 同意吗 因此,让我们以故事的形式解释 Selenium 的超凡魅力,而不是使用传统的无聊的 Power Point PPT,让我们激动不已。 这将使他们一直充满吸引力和说服力。 我强烈建议您使用 [prezi](https://prezi.com/) 创建业务演示,因为它超出了上述所有期望。 请注意,这是我根据我的专业经验提出的个人建议。
每个人都喜欢听与故事相关的故事。 同意吗因此,让我们以故事的形式解释 Selenium 的超凡魅力,而不是使用传统的无聊的 Power Point PPT,让我们激动不已。 这将使他们一直充满吸引力和说服力。 我强烈建议您使用 [prezi](https://prezi.com/) 创建业务演示,因为它超出了上述所有期望。 请注意,这是我根据我的专业经验提出的个人建议。
我已经使用 prezi 做了一个简单的演示,并以相同的场景作为示例。 这是 [vimeo 链接](https://vimeo.com/188186769),显示了我在幻灯片中浏览的视频。
......
......@@ -20,7 +20,7 @@
有很多高级编程语言,您可能想使用 C# ,但其他人可能更喜欢 Python。 每个人都希望利用通用的 WebDriver API 来以自己舒适的语言自动化浏览器。 这是语言级别绑定进入图片的地方。 这些就像用相应语言编写的*粘合代码/包装库*与 WebDriver API 进行通信。 除了 Java,C# ,Ruby,Python 绑定外,还有更多。 也很容易添加新的。
接下来到**驱动程序**上。 WebDriver API 使我们可以拥有一些驱动程序,这些驱动程序知道如何驱动与之对应的特定浏览器。 我们有 Chrome 驱动程序,IE 驱动程序,Microsoft Edge 驱动程序,Firefox 驱动程序(内置)等。还有移动专用驱动程序,例如 iOS 驱动程序,Selendriod(适用于 Android 的 Selenium)等。例如,Chrome 驱动程序知道如何 驱动 Chrome 浏览器执行低级活动,例如操纵 Web 元素,导航到网页,从中获取用户输入等等。
接下来到**驱动程序**上。 WebDriver API 使我们可以拥有一些驱动程序,这些驱动程序知道如何驱动与之对应的特定浏览器。 我们有 Chrome 驱动程序,IE 驱动程序,Microsoft Edge 驱动程序,Firefox 驱动程序(内置)等。还有移动专用驱动程序,例如 iOS 驱动程序,Selendriod(适用于 Android 的 Selenium)等。例如,Chrome 驱动程序知道如何驱动 Chrome 浏览器执行低级活动,例如操纵 Web 元素,导航到网页,从中获取用户输入等等。
我们在代码中提到了所需的驱动程序。 该驱动程序服务器作为可执行文件提供。 当我们运行测试时,驱动程序服务器会监听本地计算机上的端口。 它将解释从 WebDriver API 接收的命令,在实际的浏览器上执行,并将结果通过 API 返回给我们的代码。
......
......@@ -62,7 +62,7 @@ System.setProperty("webdriver.gecko.driver", "E:\\Softwares\\
}
```
我知道外表令人生畏! 不过不用担心 我们将阐明所有这些代码,并找出其含义。 让我们逐行走下去,不遗余力。
我知道外表令人生畏! 不过不用担心我们将阐明所有这些代码,并找出其含义。 让我们逐行走下去,不遗余力。
## 代码实践:
......
......@@ -6,7 +6,7 @@
您的测试用例可以成功运行,并且一次执行一行时可以按预期工作,但是作为套件/批处理运行时,它可能会失败。 挠头以了解其背后的原因? 让我们潜入更多!
当我们使用`driver.get("url_we_wish_to_access")``driver.navigate().to("url")`或单击超链接等时,这些调用将启动页面 在该加载活动完成之前加载并返回。 因此,如果页面的加载线程尚未填充 Web 元素,而您尝试使用`driver.findElement("locating_strategy")`找到它,则得到的只是**异常**`NoSuchElementException``ElementNotVisibleException`等。
当我们使用`driver.get("url_we_wish_to_access")``driver.navigate().to("url")`或单击超链接等时,这些调用将在该加载活动完成之前加载启动页面并返回。 因此,如果页面的加载线程尚未填充 Web 元素,而您尝试使用`driver.findElement("locating_strategy")`找到它,则得到的只是**异常**`NoSuchElementException``ElementNotVisibleException`等。
所有这些意味着我们必须找到一种告诉 Selenium 的方法,我们希望它等待一定的时间,或者直到 Web 元素变得可访问/可单击/显示为止,然后再引发可怕的异常。 在那里,不要惊慌。 我看到一些汗珠滴到你的额头上! 那么,如何使这种压力成为我们自己的大力水手菠菜的版本呢? 感谢**隐式,显式和流畅的等待**
......@@ -48,7 +48,7 @@ driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
1. 隐式等待只需要初始化一次。 设置后,它将适用于`WebDriver`对象实例的寿命。 换句话说,它将在浏览器打开的整个过程中就位。 因此,WebDriver 将等待该额外时间,然后对所有[`findElement`](https://selenium.googlecode.com/svn/trunk/docs/api/java/org/openqa/selenium/WebDriver.html#findElement(org.openqa.selenium.By))和[`findElements`](https://selenium.googlecode.com/svn/trunk/docs/api/java/org/openqa/selenium/WebDriver.html#findElements(org.openqa.selenium.By))抛出异常
2. 默认时间设置为 0。
3. 隐式等待仅影响`finddElement(s)`,它不影响其他`WebDriver`方法,例如`driver.getCurrentUrl()`等。
4. 在大多数情况下,尤其是在调试时,仅“`NoSuchElementException`”并不是很有用。 我们可能希望使用更多信息来自定义此错误消息,例如捕获屏幕快照或添加更多详细信息等。可以通过在每次`finddElement(s)`调用周围使用`try-catch`块来实现此目的,但这不是我们使用隐式等待的目标 因为这是一个全球性的时间设置。
4. 在大多数情况下,尤其是在调试时,仅“`NoSuchElementException`”并不是很有用。 我们可能希望使用更多信息来自定义此错误消息,例如捕获屏幕快照或添加更多详细信息等。可以通过在每次`finddElement(s)`调用周围使用`try-catch`块来实现此目的,但这不是我们使用隐式等待的目标因为这是一个全球性的时间设置。
5. 由于有大量的 JavaScript,因此可能会出现一些奇怪的情况。 即使该元素位于 DOM 中,也可能无法立即单击或显示或启用它。 结果我们可能会看到[`ElementNotVisibleException`](https://selenium.googlecode.com/svn/trunk/docs/api/java/org/openqa/selenium/ElementNotVisibleException.html)[`WebDriverException`](https://selenium.googlecode.com/svn/trunk/docs/api/java/org/openqa/selenium/WebDriverException.html)[`StaleElementReferenceException`](https://selenium.googlecode.com/svn/trunk/docs/api/java/org/openqa/selenium/StaleElementReferenceException.html)
6. 由于不同的元素可能在不同的时间加载,因此我们可能会说服将等待时间设置为较高的值(或等效于最慢的 Web 元素的加载时间),例如 20 秒左右。 我们对此的理由是,“无论如何,所有元素的加载速度都将比此时快,并且测试将按预期进行。” 但是您甚至猜不到**性能** - 这种方法不是一个好主意吗? 我在这里给您举几个示例,以便更好地了解,
......
......@@ -65,9 +65,9 @@ public WebElement fluentWait(final By locator) {
同意的显式等待包括对代码的更多修饰,但是您认为值得这样做吗?
**注意***您可能会想,为什么要经历所有这些痛苦? 我不能只使用`Thread.sleep()`吗? 嗯,不 不建议这样做,因为它会使整个测试脚本无条件进入休眠状态。 在大多数情况下,指定的睡眠时间不够长(导致异常),或者变得太长,导致即使元素加载速度更快,测试也要等待。*
**注意***您可能会想,为什么要经历所有这些痛苦? 我不能只使用`Thread.sleep()`吗? 嗯,不不建议这样做,因为它会使整个测试脚本无条件进入休眠状态。 在大多数情况下,指定的睡眠时间不够长(导致异常),或者变得太长,导致即使元素加载速度更快,测试也要等待。*
**令我全神贯注**:虽然显式等待涉及更多的编程部分,但由于它能够解决很多问题,使我们的生活变得更加轻松,我宁愿选择此方法,而不是隐式等待(基于 测试自动化的需求和复杂性涉及*眨眼*)。
**令我全神贯注**:虽然显式等待涉及更多的编程部分,但由于它能够解决很多问题,使我们的生活变得更加轻松,我宁愿选择此方法,而不是隐式等待(基于测试自动化的需求和复杂性涉及*眨眼*)。
您的视线是否模糊? 不要惊慌,因为所有水域都会落在后面的职位上。 我们将在屏幕截图中看到更实际的等待示例。 一旦涵盖了定位器的类型和策略,就可以更好地理解和掌握该主题。 因此,请继续关注此空间!
......
......@@ -33,7 +33,7 @@
### 1.捷径:
是否想以简单的方式在网页上找到任何元素的 XPath? 做完了 是否希望几乎每次都处于完美的工作状态? 也做完了。 马上完成所有这些操作呢? 它让您涵盖了摇滚明星! 您只需要“Firebug”! 它可以作为 Firefox 浏览器的附加组件使用。
是否想以简单的方式在网页上找到任何元素的 XPath? 做完了是否希望几乎每次都处于完美的工作状态? 也做完了。 马上完成所有这些操作呢? 它让您涵盖了摇滚明星! 您只需要“Firebug”! 它可以作为 Firefox 浏览器的附加组件使用。
食谱来了:
......
......@@ -170,7 +170,7 @@ public class Click_Image {
现在该轮到您尝试这些新学到的技能了。
有什么问题吗 在评论部分开火!
有什么问题吗在评论部分开火!
在那之前,请在另一篇文章中见。 祝你有美好的一天!
......@@ -31,7 +31,7 @@ Apache ANT 的`JunitReport`任务通过执行以下步骤来生成报告,
</fileset>
```
**注意***所有单独的 JUnit 测试都是通过“junit” ANT 任务执行的,生成的 XML 文件为 生成的名称使用“`outfile`”属性指定。 如果未提及名称,则默认值为“`TEST-name`”(其中`name`是在 junit 任务的`name`属性中指定的测试名称)。*
**注意***所有单独的 JUnit 测试都是通过“junit” ANT 任务执行的,生成的 XML 文件的名称使用“`outfile`”属性指定。 如果未提及名称,则默认值为“`TEST-name`”(其中`name`是在 junit 任务的`name`属性中指定的测试名称)。*
使用`fileset`元素,`junitreport`会从“`dir`”中提到的给定目录中收集所有单个 XML 文件,并根据上述代码段考虑所有以“`TEST-`”开头的文件。
......@@ -69,7 +69,7 @@ Apache ANT 的`JunitReport`任务通过执行以下步骤来生成报告,
* 在标题部分添加徽标
* 修改静态文字
**注意**:因此,所有更改都是对放置在项目目录“`E:\Selenium\`”(其中 Selenium 中的“`junit-frames.xsl`”)进行的 在我的情况下是项目名称)。*
**注意**:因此,所有更改都是对放置在项目目录“`E:\Selenium\`”(其中 Selenium 中的“`junit-frames.xsl`”)进行的,在我的情况下是项目名称)。
## 更改报告标题和描述
......
......@@ -4,7 +4,7 @@
我敢肯定,您现在会听说无头,因为 Google 为其 Chrome 浏览器(从 59 版开始)引入了无头选项! Firefox 紧随其后。 它也可以在无头模式下运行!! 让我们在没有 Firefox 的情况下在 Firefox 中执行一些自动化的 Selenium 测试! 😉换句话说,测试在后台运行,并且没有显示(即,浏览器 UI 不显示给用户)。 该代码还将提供给 Chrome 浏览器。
您脑海中可能会出现的第一个问题是,为什么我首先需要一个无头的浏览器? 我收到你的来信。 不用担心 我有答案并且相信我,这些都是很好的答案。 因此,事不宜迟,以下是您无头的几个原因,
您脑海中可能会出现的第一个问题是,为什么我首先需要一个无头的浏览器? 我收到你的来信。 不用担心我有答案并且相信我,这些都是很好的答案。 因此,事不宜迟,以下是您无头的几个原因,
1. 如果您的目标是获得更好的**速度****性能**,那么别无所求! 由于无需为每个测试都启动浏览器 UI,从而避免了加载 JavaScript,CSS 和呈现 HTML 所需的所有时间,因此测试运行速度更快。
2. 通常,在 **CI(连续集成)管道**中,它需要在没有实际 GUI 的服务器或 Linux OS 等系统上运行。 无头模式节省了一天!
......
......@@ -8,7 +8,7 @@
![Attribute binding with template syntax](img/1ed51c59dd82a5d6011f7e594f0eb2cc.png)
失望了吗?这是发生了什么事。 正如预期的那样,“Vue 官方网站”文本已显示为超链接。 单击它会打开一个新选项卡,因为我们使用了`_blank`作为目标(这里没什么疯狂的)。 现在,查看地址栏中的 URL。 不会像在 Vue 实例的数据对象中指定的那样导航到 [https://vuejs.org/v2/guide/index.html](https://vuejs.org/v2/guide/index.html) ,而是处理`href`属性的双引号内的值 作为字符串并解析为 URL `{{ vueLink }}`。 这就是普通 HTML `href`属性的工作方式,这就是您在新打开的标签页的地址栏中看到的内容。 显然,绑定从未发生过。
失望了吗?这是发生了什么事。 正如预期的那样,“Vue 官方网站”文本已显示为超链接。 单击它会打开一个新选项卡,因为我们使用了`_blank`作为目标(这里没什么疯狂的)。 现在,查看地址栏中的 URL。 不会像在 Vue 实例的数据对象中指定的那样导航到 [https://vuejs.org/v2/guide/index.html](https://vuejs.org/v2/guide/index.html),而是将`href`属性的双引号内的值当做字符串,并解析为 URL `{{ vueLink }}`。 这就是普通 HTML `href`属性的工作方式,这就是您在新打开的标签页的地址栏中看到的内容。 显然,绑定从未发生过。
因此,这就是 Vue 的工作方式。 我们不能将模板语法/大括号括起来用于 HTML 属性绑定。 但是,如果我们仍然想将某些东西动态绑定到属性上怎么办? 不要担心! Vue 附带了另一个用于此目的的指令`v-bind`。 只要我们花时间寻找指令,指令就在我们周围。
......
......@@ -6,7 +6,7 @@
但是该怎么办? 我们忙于观看 Netflix 时,Evan You(Vue 的创建者)出于某种原因添加了它。 因此,让我们看看为什么该指令首先存在。 *警告*:这篇文章是“[条件渲染第 1 部分](https://javabeginnerstutorial.com/vue-js/7-conditional-rendering-part-1/)”的继续,因此,我建议您在继续进行之前先充分了解这些概念。
我们讨论了`v-if``v-else`等不仅可以应用于单个 HTML 元素,而且可以应用于使用`<div>``<template>`等的元素块。让我们首先来看一个带有`<template>`元素的示例 并了解它作为*不可见包装器*的行为,以最终结果呈现给 DOM。
我们讨论了`v-if``v-else`等不仅可以应用于单个 HTML 元素,而且可以应用于使用`<div>``<template>`等的元素块。让我们首先来看一个带有`<template>`元素的示例并了解它作为*不可见包装器*的行为,以最终结果呈现给 DOM。
## 使用`<template>`元素
......@@ -48,7 +48,7 @@ data: {
该指令将确保 DOM 中始终存在**元素**。 将显示条件是否为真(求值为`true`)。 当条件求值为`false`时,该元素将通过自动添加 CSS 属性`display: none`来隐藏! 听起来不有趣吗?
这个概念可能很难缠住我们的头脑。 不用担心 我已经覆盖了你。 示例和屏幕截图可为我们提供帮助!
这个概念可能很难缠住我们的头脑。 不用担心我已经覆盖了你。 示例和屏幕截图可为我们提供帮助!
在前面的示例中,让我们将`v-show`指令添加到第二段标签中。
......
......@@ -56,7 +56,7 @@ var app = new Vue({
### 3\. 访问键,值和当前索引
第三个自变量 可用于获取正在访问键值对的当前指标。 同样,这些论据的顺序很重要。 第一个参数将始终是值,第二个参数将是键,第三个参数是当前索引。 参数名称可以一如既往地由我们选择。 不要忘记将所有这些参数括在括号中。 为了更好地理解,让我们将“`k`”用作键,将“`v`”用作值,将“`i`”用作当前索引。
第三个自变量可用于获取正在访问键值对的当前指标。 同样,这些论据的顺序很重要。 第一个参数将始终是值,第二个参数将是键,第三个参数是当前索引。 参数名称可以一如既往地由我们选择。 不要忘记将所有这些参数括在括号中。 为了更好地理解,让我们将“`k`”用作键,将“`v`”用作值,将“`i`”用作当前索引。
```html
<div v-for="(v, k, i) in letters"> {{ k }} for {{ v }} - ({{ i }}) </div>
......
......@@ -56,7 +56,7 @@ new Vue({
每当用户释放按键或按键上升时,就会触发`keyup`事件。 在这种情况下,我们要监听`Enter`键,而不仅仅是其他键。 因此,让我们通过在`keyup`事件之后添加一个点来提及其键码为`13`。 想知道我怎么知道那个关键代码? 常用的,通常会放在我们的头上。 如果不是,请尝试 [https://keycode.info/](https://keycode.info/) 获取键盘上任何键的键码。 太酷了!
但是,记住密码还是一直找 Google 麻烦吗? 不用担心 就像`.once``.prevent``.self`等事件修饰符一样,Vue 为我们提供了用于大多数常用键的**键修饰符**。 清单是这样的
但是,记住密码还是一直找 Google 麻烦吗? 不用担心就像`.once``.prevent``.self`等事件修饰符一样,Vue 为我们提供了用于大多数常用键的**键修饰符**。 清单是这样的
* `.enter`
* `.tab`
......
......@@ -61,7 +61,7 @@ data: {
}
```
这段代码工作得很好。 单击链接“`Google`”,将打开一个新标签,并导航到 Google 页面。 但是我们想看起来很酷。 不是吗 因此,编写`v-bind`指令的简短方法是一次性删除`v-bind`一词,而仅使用**冒号**
这段代码工作得很好。 单击链接“`Google`”,将打开一个新标签,并导航到 Google 页面。 但是我们想看起来很酷。 不是吗因此,编写`v-bind`指令的简短方法是一次性删除`v-bind`一词,而仅使用**冒号**
```java
<! Cool way of writing v-bind -->
......
......@@ -113,6 +113,6 @@ new Vue({
该代码一如既往在 [GitHub 仓库](https://github.com/JBTAdmin/vuejs)中可用。
试一试,并注意 Vue 如何根据输入类型是否为文本字段,复选框,单选按钮,选择,多选,文本区域元素等来正确更新元素……它看起来和听起来很神奇,因为所有语法 您需要完成一个简单的指令`v-model`来完成这项艰巨的任务。 如果遇到任何问题,请随时在评论部分大声疾呼。
试一试,并注意 Vue 如何根据输入类型是否为文本字段,复选框,单选按钮,选择,多选,文本区域元素等来正确更新元素……它看起来和听起来很神奇,因为你需要用于完成这项艰巨的的所有语法,都是一个简单的指令`v-model`。 如果遇到任何问题,请随时在评论部分大声疾呼。
祝您有美好的一天!
......@@ -2,7 +2,7 @@
> 原文: [https://javabeginnerstutorial.com/vue-js/15-form-input-bindings/](https://javabeginnerstutorial.com/vue-js/15-form-input-bindings/)
欢迎参加有约束力的讨论! 现在我们已经了解了这个超级巨星`v-model`,它用于在表单元素上实现[双向数据绑定](https://javabeginnerstutorial.com/vue-js/14-two-way-binding-v-model/),让我们通过选择正确的更新方式来直观地了解 Vue 如何在引擎盖下神奇地工作 基于是单选按钮还是复选框还是`select`元素的特定 HTML 元素。
欢迎参加有约束力的讨论! 现在我们已经了解了这个超级巨星`v-model`,它用于在表单元素上实现[双向数据绑定](https://javabeginnerstutorial.com/vue-js/14-two-way-binding-v-model/),让我们直观地了解 Vue 如何在引擎盖下神奇地工作,通过选择正确的更方式来更新特定 HTML 元素,基于它是单选按钮还是复选框还是`select`元素。
今天,我们将讨论以下内容,
......
......@@ -132,7 +132,7 @@ String is not Hi
> 与其他语言不同,Java 不接受数字作为条件运算符。 它仅将*布尔表达式*视为返回`TRUE`或`FALSE`的条件。
>
> **例如**`if(x = 1)`不允许,而`if(1 == 1)`被接受,因为它是布尔表达式 并将返回`true`。
> **例如**`if(x = 1)`不允许,而`if(1 == 1)`被接受,因为它是布尔表达式并将返回`true`。
#### `if-else if`语句语法
......
......@@ -49,7 +49,7 @@ if sys.version_info[0] != 3:
## 安装 Python
Python 3.5 当前仅是候选版本。 这意味着不鼓励 Python 开发人员在生产环境中使用此版本-但计划于 9 月中旬推出该版本,因此在不久的将来会非常实际,并且候选发布版很可能包含与 最终版本将
Python 3.5 当前仅是候选版本。 这意味着不鼓励 Python 开发人员在生产环境中使用此版本-但计划于 9 月中旬推出该版本,因此在不久的将来会非常实际,并且候选发布版很可能包含最终版本
也许您已经注意到您已经在计算机上安装了 Python。 要验证这一点,您必须输入
......
......@@ -26,7 +26,7 @@ else:
print(n)
```
如您所见,此应用现在受到了一定的限制,因为它在启动时仅执行一次,但是在下一篇文章中,我将介绍循环,然后我们将变得势不可挡,并且可以编写可以运行并运行的应用……希望您能 这个想法。
如您所见,此应用现在受到了一定的限制,因为它在启动时仅执行一次,但是在下一篇文章中,我将介绍循环,然后我们将变得势不可挡,并且可以编写可以运行并运行的应用……希望您能理解这个想法。
如果我运行该应用,一些示例输出将如下所示:
......
......@@ -59,7 +59,7 @@ for x in range(5):
当“`for`”函数和相关函数在可迭代对象上运行时,它们实际上首先要从该对象请求一个迭代器。 如果失败,则将引发异常,否则,该迭代器将反复用于获取序列中的下一项,直到序列用尽。
实际上,这意味着“`for`”可以循环可提供迭代器的任何对象,但不能循环 在其他任何事情上 像`int``float`之类的对象不能与的一起使用,因为它们没有实现正确的方法。
实际上,这意味着“`for`”可以循环可提供迭代器的任何对象,但不能在其他任何事情上循环。像`int``float`之类的对象不能与其一起使用,因为它们没有实现正确的方法。
```java
# Example: for statement works over a list, but not over a float
......
......@@ -6,7 +6,7 @@
## 为什么注解很好
正如您将在示例代码中看到的那样:使用注释,您可以在实体类定义本身中看到属性映射是什么,因此您无需查找正确的`.hbm.xml`文件即可查找 映射定义。
正如您将在示例代码中看到的那样:使用注释,您可以在实体类定义本身中看到属性映射是什么,因此您无需查找正确的`.hbm.xml`文件即可查找映射定义。
而且有一个很好的副作用:您只需要修改实体。 例如,如果要向`Book`类添加新的`Date`字段,则还需要在`Book.hbm.xml`文件中添加映射。 使用注释,这只是 Java 类中的更改。 您将在本文后面的示例中找到有关使用日期的示例。
......@@ -81,7 +81,7 @@
## 扩展实体
前面我提到过,添加日期字段有点复杂,因为映射日期并不是那么简单的动作。 为此,我需要在字段上使用`@Temporal`注解,以告知 Hibernate 我要将日期存储在数据库中,并且当我读取数据库时希望返回日期 信息。 `javax.persistence.TemporalType`告诉我要存储哪种信息。 现在是日期。
前面我提到过,添加日期字段有点复杂,因为映射日期并不是那么简单的动作。 为此,我需要在字段上使用`@Temporal`注解,以告知 Hibernate 我要将日期存储在数据库中,并且当我读取数据库时希望返回日期信息。 `javax.persistence.TemporalType`告诉我要存储哪种信息。 现在是日期。
```java
@Temporal(TemporalType.DATE)
......
......@@ -334,7 +334,7 @@ int main()
### 在哪里使用循环链表?
使用此列表的实际应用是在其上运行多个应用的​​PC。 循环链表在操作系统中很常见,因为它会将正在运行的应用放在列表中,并且当列表即将到达其末端时,操作系统很容易使用循环链表,因为操作系统可以循环运行列表的最前面。 将该时隙分配给列表中的每个应用。
使用此列表的实际应用是在其上运行多个应用的​​PC。 循环链表在操作系统中很常见,因为它会将正在运行的应用放在列表中,并且当列表即将到达其末端时,操作系统很容易使用循环链表,因为操作系统可以循环运行列表的最前面。 将该时隙分配给列表中的每个应用。
**在 C 中实现循环链​​表**
......
......@@ -157,7 +157,7 @@ Thread(String name)
`sleep()``sleep()`方法是`Thread`类的静态方法。 (它仍然必须乞求成为当前正在运行的线程)。 由于它仅在当前是静态方法,因此运行`Thread`将进入睡眠状态。 语法为:`Thread.sleep()`
**`yield()`**`yield`方法与`Thread`的优先级相关。 这也是一个静态方法,因此它仅适用于当前正在运行的线程。 调度程序确保如果线程进入可运行状态,并且其优先级高于池中的任何线程,并且具有比当前正在运行的线程更高的优先级,则优先级较低的运行线程通常会被撞回可运行状态 然后将选择优先级最高的线程来运行。 在任何给定时间,当前正在运行的线程通常不会具有低于池中任何线程的优先级。 `yield()`应该做的是使当前正在运行的线程回到可运行状态,以允许具有相同优先级的其他线程轮流使用。
**`yield()`**`yield`方法与`Thread`的优先级相关。 这也是一个静态方法,因此它仅适用于当前正在运行的线程。 调度程序确保如果线程进入可运行状态,并且其优先级高于池中的任何线程,并且具有比当前正在运行的线程更高的优先级,则优先级较低的运行线程通常会被撞回可运行状态然后将选择优先级最高的线程来运行。 在任何给定时间,当前正在运行的线程通常不会具有低于池中任何线程的优先级。 `yield()`应该做的是使当前正在运行的线程回到可运行状态,以允许具有相同优先级的其他线程轮流使用。
**`Join()`**`Join`是一种非静态方法。 它使一个线程“连接到另一线程的末端”。 如果将线程 B 连接线程 A,则直到线程 A 完成,线程 B 才会启动。
......
......@@ -6,7 +6,7 @@
## Java Lambda 表达式
Java Lambda 表达式是 Java 的一个重要的新功能,已在 Java 8 中引入。Lambda 表达式是不属于任何类的匿名函数(无名称的函数),表示该函数没有名称,并且 没有课程。 Lambda 表达式通过促进 Java 中的函数式编程大大简化了开发。 它用于提供函数式接口的实现(函数式接口是仅包含一种方法的接口。例如,Java 标准的`Runnable`接口是函数式接口)。 它还有助于迭代,过滤和从集合库中提取数据。 Lambda 表达式使您可以将代码视为数据,将功能视为方法参数。
Java Lambda 表达式是 Java 的一个重要的新功能,已在 Java 8 中引入。Lambda 表达式是不属于任何类的匿名函数(无名称的函数),表示该函数没有名称,并且没有类。 Lambda 表达式通过促进 Java 中的函数式编程大大简化了开发。 它用于提供函数式接口的实现(函数式接口是仅包含一种方法的接口。例如,Java 标准的`Runnable`接口是函数式接口)。 它还有助于迭代,过滤和从集合库中提取数据。 Lambda 表达式使您可以将代码视为数据,将功能视为方法参数。
### Lambda 表达式的语法
......
......@@ -8,7 +8,7 @@
**内容**:自动测试是指借助工具自动执行手动过程以测试被测应用/系统的过程。
**原因**:在当今世界,由于高度互动,响应迅速且功能丰富的内容可以满足遍布全球的大量最终用户,因此编写的大多数软件应用都是基于 Web 的 以经济的代价。 对质量的需求以及对上市时间和预算的竞争压力也急剧增加。 为了节省时间和金钱,增加测试覆盖范围,实现最佳质量并提高客户满意度,测试自动化已成为强制性要求!
**原因**:在当今世界,由于高度互动,响应迅速且功能丰富的内容可以满足遍布全球的大量最终用户,因此编写的大多数软件应用都是以经济的代价基于 Web 的。 对质量的需求以及对上市时间和预算的竞争压力也急剧增加。 为了节省时间和金钱,增加测试覆盖范围,实现最佳质量并提高客户满意度,测试自动化已成为强制性要求!
**何时**变得有利?
......
......@@ -17,7 +17,7 @@
* “文件”菜单用于创建,打开,保存,导出,关闭测试用例和测试套件。
* 也可以查看最近使用的测试用例/测试套件文件。
* 默认情况下,测试以 HTML 格式保存。
* 这里最方便我们使用的最佳选项是“**将测试用例导出为…**”和“**将测试用例导出为…**”,因为它们使我们可以转换自动 Selenium 测试用例 将 IDE 转换为可以直接在 Selenium 远程控制或 WebDriver 中使用的格式组合(编程语言/单元测试框架/ Selenium 框架)。 我们将继续进行介绍。
* 这里最方便我们使用的最佳选项是“**将测试用例导出为…**”和“**将测试用例导出为…**”,因为它们使我们可以将 Selenium IDE 测试用例,自动转换为可以直接在 Selenium 远程控制或 WebDriver 中使用的格式组合(编程语言/单元测试框架/ Selenium 框架)。 我们将继续进行介绍。
下面是文件菜单的快照,其中“导出测试用例为...”选项已展开。
......@@ -82,7 +82,7 @@
![Options_FormatsTab](img/b91c63027b049273e73b7783b205df00.png)
此选项卡显示 Selenium IDE 中的可用格式以及所选格式的示例 结构体。 用户可以轻松地添加/重命名/删除任何可用格式。
此选项卡显示 Selenium IDE 中的可用格式以及所选格式的结构示例。 用户可以轻松地添加/重命名/删除任何可用格式。
![Options_Plugins](img/ea86a0c33f4595b96ebf8389efba551c.png)
......
......@@ -8,7 +8,7 @@
![Toolbar](img/705c2851f112cc61e4466373687df993.png)
Selenium IDE 提供了一个非常简单但有用的工具栏,可用于记录,播放,暂停,逐步和安排测试 点击。 是时候深入了解了……
Selenium IDE 提供了一个非常简单但有用的工具栏,可用于点击来记录,播放,暂停,逐步和安排测试。 是时候深入了解了……
![Playback Speed](img/9650a8260119682e51b2e81fe5c5ae97.png)
......@@ -98,7 +98,7 @@ Selenium IDE 工具的左侧有一个测试用例窗格,如下所示,
![Log_Error](img/cd364b50a50aa0bb5de1cda4961cc7e6.png)
* **调试**:提供有关 Selenium IDE 在后台执行的操作的技术信息,例如 称为函数,加载外部 JavaScript 文件等。
* **调试**:提供有关 Selenium IDE 在后台执行的操作的技术信息,例如调用函数,加载外部 JavaScript 文件等。
* **信息**:提供有关当前正在执行的命令的信息。
* **警告**:在极少数情况下显示警告消息,例如无效的参数/意味着较少的条件等。
* **错误**:在执行导致无法通过的测试用例期间发生错误时显示的消息。 如果同样不满足“断言”和“验证”命令中提到的条件,则会生成错误。
......
......@@ -142,7 +142,7 @@ This is in method
隐式`super()`可以由显式`super()`代替。 超级语句必须是构造器的第一条语句。 显式超类允许将参数值传递给其超类的构造器,并且必须具有匹配的参数类型。 子类的构造器中的`super()`调用将基于调用的签名,导致超类中相关构造器的调用。 这称为构造器链接。
`super()``this()`构造:如果在构造器中使用,则它必须作为构造器中的第一条语句出现,并且只能在构造器声明中使用。 这意味着`this()``super()`调用不能同时出现在同一构造器中。 就像`this()`构造导致同一类中的构造器链接一样, `super()`构造也导致了子类构造器与超类构造器的链接。 如果构造器既没有`this()`也没有`super()`构造作为其第一条语句,则`super()`调用默认构造器 超类被隐式插入。
`super()``this()`构造:如果在构造器中使用,则它必须作为构造器中的第一条语句出现,并且只能在构造器声明中使用。 这意味着`this()``super()`调用不能同时出现在同一构造器中。 就像`this()`构造导致同一类中的构造器链接一样, `super()`构造也导致了子类构造器与超类构造器的链接。 如果构造器既没有`this()`也没有`super()`构造作为其第一条语句,则调用超类默认构造器的`super()`被隐式插入。
> 如果一个类仅定义非默认构造器,则其子类将不包含隐式`super()`调用。 这将被标记为编译时错误。
>
......
......@@ -61,7 +61,7 @@
选择要识别其 UI 元素的任何命令,然后单击“查找”按钮,如上图所示。 在选定的命令(本例中为“`id`”)中由`locator`参数指定的对应元素在 Firefox 浏览器显示的网页上以**黄色**的瞬间显示为**高亮显示**。 包含在**绿色边框**中。
因此,Selenium IDE 能够按预期识别和访问元素。 如果它在网页上突出显示了错误的元素或根本没有检测到元素,那么我们可以确保选择的**定位符类型**(在即将发布的博客中有更多相关内容)或 脚本本身。
因此,Selenium IDE 能够按预期识别和访问元素。 如果它在网页上突出显示了错误的元素或根本没有检测到元素,那么我们可以确保选择的**定位符类型**(在即将发布的博客中有更多相关内容)或脚本本身。
**页面源**
......
......@@ -42,7 +42,7 @@
## 生成命令的简单方法
Selenium 涉及的一项主要活动是使用不同的定位器来识别 Web 元素。 Selenium IDE 会自动为您执行此操作。 但是在某些情况下,您可能想插入新的命令(以及通过记录活动获得的自动生成的代码)来进行断言,验证等。在这种情况下,请不要使用检查元素功能来定位 Web 元素 然后努力使用正确的命令语法,我们有了一个捷径。 **右键单击!** 你没听错。
Selenium 涉及的一项主要活动是使用不同的定位器来识别 Web 元素。 Selenium IDE 会自动为您执行此操作。 但是在某些情况下,您可能想插入新的命令(以及通过记录活动获得的自动生成的代码)来进行断言,验证等。在这种情况下,请不要使用检查元素功能来定位 Web 元素然后努力使用正确的命令语法,我们有了一个捷径。 **右键单击!** 你没听错。
右键单击您要在其上执行操作的网页元素(显然是在 Firefox 浏览器中!),将自动打开一个菜单,提示与所选元素配合使用的大多数可能的 Selenium 命令。 要获取整个列表,只需单击“显示可用命令”选项。
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册