提交 6534fb6b 编写于 作者: W wizardforcel

2020-06-25 12:07:05

上级 a1f73222
# 7 河。 Selenium IDE – 暂停和反射
# 7Q Selenium IDE – 暂停和反射
> 原文: [https://javabeginnerstutorial.com/selenium/7r-ide-pause-reflect/](https://javabeginnerstutorial.com/selenium/7r-ide-pause-reflect/)
......
# 8.给新手的惊喜
# 8 给新手的惊喜
> 原文: [https://javabeginnerstutorial.com/selenium/8-surprise-freebie/](https://javabeginnerstutorial.com/selenium/8-surprise-freebie/)
......@@ -8,17 +8,17 @@
因此,如果您可以集中精力并强调 Selenium 工具套件在这些方面的积极方面,那么您一定会品尝到成功的。 而这正是我要令您惊讶的地方。
每个人都喜欢听与故事相关的故事。 同意吗 因此,让我们以故事的形式解释 Selenium 的超凡魅力,而不是使用传统的无聊的 Power Point 演示文稿,让我们激动不已。 这将使他们一直充满吸引力和说服力。 我强烈建议您使用 [prezi](https://prezi.com/) 创建业务演示,因为它超出了上述所有期望。 请注意,这是我根据我的专业经验提出的个人建议。
每个人都喜欢听与故事相关的故事。 同意吗 因此,让我们以故事的形式解释 Selenium 的超凡魅力,而不是使用传统的无聊的 Power Point PPT,让我们激动不已。 这将使他们一直充满吸引力和说服力。 我强烈建议您使用 [prezi](https://prezi.com/) 创建业务演示,因为它超出了上述所有期望。 请注意,这是我根据我的专业经验提出的个人建议。
我已经使用 prezi 做了一个简单的演示,并以相同的场景作为示例。 这是 [vimeo 链接](https://vimeo.com/188186769),显示了我在幻灯片中浏览的视频。
您一定在想我是怎么想到这个好主意的。 正如小兵曾经说过的,我当然会自言自语! 有时我需要专家的建议。 (好吧,明白了,别那样看着我!)继续…
## 演示文稿的简要说明:
## PPT的简要说明:
该视频首先向您展示演示的整体情况。 我们的大脑更喜欢视觉而不是文字。 因此,始终要畅所欲言,并在幻灯片上显示相关图像,而不是数百个单词,这始终是一个好习惯。
* *幻灯片 1*: 'WOW'。 用**爆炸**打开演示文稿! 首先要引起您对样式的“迷恋”。 可能是*现实生活中的事件,假想的场景,发人深省的报价或问题*
* *幻灯片 1*: 'WOW'。 用**爆炸**打开PPT! 首先要引起您对样式的“迷恋”。 可能是*现实生活中的事件,假想的场景,发人深省的报价或问题*
* *幻灯片 2*: 面临的挑战。 简单介绍一下我们在没有自动化的情况下面临的挑战/问题。 允许客户**考虑**。 这也应该作为介绍的介绍。 例如,显示简单场景的图形。 对于每个发行版,测试用例数量都会增加(回归套件+发行用例),从而增加了总体开发成本。 这最终减少了产品的上市时间,这可能会对总收入/销售额造成重大打击。
......@@ -47,7 +47,7 @@
所有这些看起来都不酷吗? 如果是,那您还等什么呢? 成为哈利·波特! 添加您的魔力和创造力,进行自定义,使其更具表现力和令人印象深刻!
像我创建的演示文稿一样,想要复制它并根据您的要求进行编辑吗? 这是我的 [**prezi 链接**](https://prezi.com/t23nditffrdy/?utm_campaign=share&utm_medium=copy&rc=ex0share)。 我将其设置为“*公开且可重复使用*”。 复制副本之前,请先点击“赞”按钮,希望您喜欢这个免费赠品。🙂
像我创建的PPT一样,想要复制它并根据您的要求进行编辑吗? 这是我的 [**prezi 链接**](https://prezi.com/t23nditffrdy/?utm_campaign=share&utm_medium=copy&rc=ex0share)。 我将其设置为“*公开且可重复使用*”。 复制副本之前,请先点击“赞”按钮,希望您喜欢这个免费赠品。🙂
在评论部分让我知道您的想法和经验。 即将在我们即将推出的,期待已久的 WebDriver 系列中与您见面!
# 9A WebDriver – 体系结构及其工作方式
# 9A WebDriver – 构及其工作方式
> 原文: [https://javabeginnerstutorial.com/selenium/9a-webdriver-architecture/](https://javabeginnerstutorial.com/selenium/9a-webdriver-architecture/)
......
......@@ -12,27 +12,27 @@
![Junit download link](img/2ebeaa310c0820cf2a30387c19b8deca.png)
#### 第 2 步
#### 步骤 2
以下几点将使该过程更加容易理解,
1. 您将被重定向到 GitHub。 在“普通的 JAR”下,可以使用 junit 和 hamcrest-core JAR。
2. 点击“`junit.jar`”会将您重定向到包含下载链接的页面。 点击最新版本的“jar”链接(撰写本文时为 v4.12)。 它将自动下载到您的系统。
3. 接下来,点击“hamcrest-core.jar”。 与上述类似,单击最新的“jar”下载链接(截至本帖子发布之日起为 v1.3)。
3. 接下来,点击“`hamcrest-core.jar`”。 与上述类似,单击最新的“jar”下载链接(截至本帖子发布之日起为 v1.3)。
4. 这样,两个必需的 jar 都立即下载到您的系统中。
下图是突出显示步骤的图像,
![Junit github download](img/7005b00c271ea16c61aabcaf3bc4aca4.png)
#### 第三步
#### 步骤 3
下一个工作是在 Eclipse IDE 中将这两个 jar 添加到我们的项目中。 该过程与我们在[“9b 设置 WebDriver(在 Eclipse 中)”](https://javabeginnerstutorial.com/selenium/9b-webdriver-eclipse-setup/)中遵循的过程非常相似。请参考该指南以获取分步说明以及屏幕截图。
1. 打开 Eclipse IDE 并导航到相应的工作区。
2. 右键单击设置了 Selenium 的项目->构建路径->配置构建路径…
2. 右键单击“设置 Selenium 的项目 -> 构建路径 -> 配置构建路径…”
3. 确保选择了“库”选项卡。 点击“添加库...”
4. 选择“用户库”->接下来->单击“用户库...”
4. 选择“用户库”,接下来单击“用户库...”
5. 单击“新建...”,并为库“JUnit4”命名,然后单击“确定”。
6. 在“用户库”弹出窗口中,确保选择了新创建的 Junit4 库。 点击“添加外部 JAR ...”
7. 导航到本地系统中下载的与 junit 相关的 jar 的保存路径。 选择 junit 和 hamcrest-core JAR,然后单击“打开”
......
# 9 WebDriver – 在 JUnit4 中运行 WebDriver 测试
# 9G WebDriver – 在 JUnit4 中运行 WebDriver 测试
> 原文: [https://javabeginnerstutorial.com/selenium/9g-webdriver-running-tests-junit4/](https://javabeginnerstutorial.com/selenium/9g-webdriver-running-tests-junit4/)
......@@ -100,7 +100,7 @@ public class FirstJunitTest {
在这三个注释下的**方法***公开的*,返回类型为`void`。 在`junit.framework.TestCase`类下,我们有`setUp()``tearDown()`方法。 最佳实践是覆盖这些方法,以分别编写初始化代码和清除代码。 这不仅可以防止内存泄漏,还可以使代码更易于阅读。 JUnit 首先调用`setUp()`方法,然后调用`test`方法,最后调用`tearDown()`方法。 对于附加到`@Test`的每个测试方法,都会发生这种情况。
#### 要运行测试
#### 要运行测试
右键单击“类 -> 运行方式 -> JUnit 测试”。
......
# 9 小时 WebDriver – 隐式等待
# 9H WebDriver – 隐式等待
> 原文: [https://javabeginnerstutorial.com/selenium/9h-webdriver-implicit-waits/](https://javabeginnerstutorial.com/selenium/9h-webdriver-implicit-waits/)
......
......@@ -55,7 +55,7 @@ public WebElement fluentWait(final By locator) {
在这里,我们声明超时值为 20 秒的流畅等待,每 2 秒(频率)轮询 DOM 直到找到元素为止,并在此时间间隔内忽略`NoSuchElementException`。 我们在上面的代码片段中创建了一个新函数,以在`.until()`中标识此 Web 元素。
#### 有几点值得您花时间
#### 有几点值得您花时间
1. 与隐式等待不同,此方法适用于`findElement(s)`以及您可能会想到的在自动化网页时进行枚举的任何其他条件。
2. 可以自定义默认超时值和频率,并且仅将其应用于特定元素,这与隐式等待不同,隐式等待在启动后就适用于`WebDriver`对象实例的寿命。
......
# 9J WebDriver – 定位元素:第 1 部分(按 Id,名称,标签名称)
# 9J WebDriver – 定位元素:第 1 部分(按 ID,名称,标签名称)
> 原文: [https://javabeginnerstutorial.com/selenium/9j-webdriver-locating-elements-1/](https://javabeginnerstutorial.com/selenium/9j-webdriver-locating-elements-1/)
......@@ -73,7 +73,7 @@ driver.findElement(By.name("LastName"));
![Locating by Name](img/db99d6c97b75004afe20751036b629d8.png)
## 通过标记名 定位
## 通过标签名定位
在这里,我们使用标记的实际名称,例如`<a>`作为锚,`<form>`作为表。 当我们想要获得具有给定标签名称的所有元素时,这很有用。 如果被测页面只有一个标签,则`findElement`将起作用。 但否则,建议对结果建立索引以找到我们希望使用的特定元素。
......@@ -92,7 +92,7 @@ List<WebElement> buttons = driver.findElements(By.tagName("a"));
WebElement signInButton = buttons.get(0);
```
## 总体图片
## 概览
为了避免在尝试使用这些定位器时可能遇到的意外意外,让我们看一个实现上述定位器类型的测试用例。
......
......@@ -8,7 +8,7 @@
* `LinkText`
* `partialLinkText`
### 按类名称定位
### 按类名称定位
类名称不过是用于设置 Web 元素样式的 CSS 类名称。 重要的是要注意页面上的许多 Web 元素可能具有相同的`className`。 在这种情况下,可以使用`findElements`方法,并且可以为结果建立索引。 请参考通过`tagName`策略定位(解释以及[先前文章](https://javabeginnerstutorial.com/selenium/9j-webdriver-locating-elements-1/)中提供的示例)。 如果我们有一个具有唯一`className`的元素,或者被测元素是该页面中使用该`className`的第一个元素,则`findElement`将执行此任务。
......@@ -64,7 +64,7 @@ driver.findElement(By.partialLinkText("I prefer to"));
![Locating by partialLinkText](img/6a482332c4ee93dfee4745bc0fa27f77.png)
## 总体图片
## 概览
让我们看一个实现上述三种定位器类型的测试用例。
......
# 9 升 WebDriver – 定位元素:第 3a 部分(由 cssSelector 提供
# 9L WebDriver – 定位元素:第 3a 部分(按`cssSelector`定位
> 原文: [https://javabeginnerstutorial.com/selenium/9l-webdriver-locating-elements-3a/](https://javabeginnerstutorial.com/selenium/9l-webdriver-locating-elements-3a/)
......@@ -6,7 +6,7 @@
如果我们没有选择使用 ID,类或名称来查找元素的方法,该怎么办? 袖子上有东西吗? 好吧,我有一个`cssSelector`。 这是一种先进而有效的策略。
##### 准备点亮
##### 热身
* **CSS** (级联样式表)。 根据维基百科的说法,“CSS 是一种样式表语言,用于描述以标记语言编写的文档的表示形式”。 它通过添加样式来更改 HTML 元素的外观,并定义应如何在网页上显示它们。
* **选择器**是使用 HTML 标记,属性及其值构造的模式。 然后将它们用于匹配所需的 Web 元素。
......
......@@ -11,7 +11,7 @@
事不宜迟,让我们开始行动吧!
## 1.定位子元素
## 定位子元素
也可以使用`cssSelectors`来定位子元素。
......@@ -79,7 +79,7 @@ driver.findElement(By.cssSelector("ul#pets li:nth-of-type(2)"));
`cssSelectors`也帮助我们使用子字符串来定位元素。
### 匹配前缀(或)开头
### 匹配前缀(或)开头
为了匹配具有已知前缀的元素,
......@@ -101,7 +101,7 @@ driver.findElement(By.cssSelector("ul#pets li:nth-of-type(2)"));
driver.findElement(By.cssSelector("input[id^='Last']"));
```
### 匹配后缀(或)结尾
### 匹配后缀(或)结尾
为了匹配具有已知后缀的元素,
......@@ -145,7 +145,7 @@ Considering the below code,
driver.findElement(By.cssSelector("input[name*='wdAg']"));
```
## 总体图片
## 概览
让我们看一个测试用例,它实现了使用本方法和上一篇文章中介绍的`cssSelector`定位器的不同方法,
......
......@@ -160,7 +160,7 @@ driver.findElements(By.xpath("//*[contains(@class,'goog-inline-block')]"));
明确指出要使用“`findElements`”,以便将所有已标识的 Web 元素添加到列表中。 如果使用“`findElement`”,它将仅返回所标识的第一个元素。
**总体图片**
**概览**
让我们来看一个测试案例,该案例实现了迄今为止本文中涵盖的所有技术,
......
......@@ -86,7 +86,7 @@ XPath 轴定义在当前节点浏览 DOM 的树形结构时要考虑的相对于
| 祖先或自我 | 选择当前节点的所有祖先(父,祖父母等)和当前节点本身 |
| 属性 | 选择当前节点的所有属性 |
| 儿童 | 选择当前节点的所有子节点 |
| 后 | 选择当前节点的所有后代(子代,孙代等) |
| 后 | 选择当前节点的所有后代(子代,孙代等) |
| 后代或自己 | 选择当前节点的所有后代(子代,孙代等)和当前节点本身 |
| 以下 | 选择当前节点的结束标记之后的文档中的所有内容 |
| 继兄弟 | 选择当前节点之后的所有同级 |
......@@ -98,7 +98,7 @@ XPath 轴定义在当前节点浏览 DOM 的树形结构时要考虑的相对于
让我们来看一些重要的
### 3a 父轴
### 3a. 父轴
选择当前节点的父级。
......@@ -122,7 +122,7 @@ driver.findElement(By.xpath("//i[@class='fb_logo']/parent::a"));
将找到具有`href``title`属性的父节点“`a`”。
### 3b 祖先轴
### 3b. 祖先轴
选择当前节点的所有祖先(父代,祖父母等)。
......@@ -142,7 +142,7 @@ driver.findElement(By.xpath("//select[@id='month']/ancestor::div[@class='_5k_5']
选择该特定示例以显示可以组合多个轴以获得所需的结果。
### 3c 子轴
### 3c. 子轴
选择当前节点的所有子节点
......@@ -162,7 +162,7 @@ driver.findElement(By.xpath("//label[@id='loginbutton']/child::input"));
标识为“`loginbutton`”的标签的子节点-标识为“`u_0_q`”的输入标签。
### 3d。 后裔
### 3d. 后代
选择当前节点的所有后代(子代,孙代等)。
......@@ -184,7 +184,7 @@ driver.findElement(By.xpath("//div[contains(@class,'uiStickyPlaceholderInput')]/
类别为`uiStickyPlaceholderInput``div`标签的后代节点-ID 为`u_o_1`的输入标签已找到。
### 3e 同级轴
### 3e. 同级轴
选择当前节点之后的所有同级
......@@ -211,7 +211,7 @@ driver.findElement(By.xpath("//td[@class='_51m- hLeft plm']/following-sibling::t
将后继同级和子级轴组合在一起,以在页脚部分中找到“登录”超链接。
### 3f 上一个同级轴
### 3f. 上一个同级轴
选择当前节点之前的所有同级
......@@ -246,7 +246,7 @@ driver.findElement(By.xpath("//label[@class='_58mt']/preceding-sibling::input"))
*我将根据我的经验个人建议 **Pomodoro 技术**。 它非常有效。 试一试!*
## 总体图片
## 概览
让我们来看一个测试案例,该案例实现了迄今为止本文中涵盖的所有技术,
......
# 9 便士 WebDriver – Timesaver /捷径:定位器验证
# 9P WebDriver – 节省时间的捷径:定位器验证
> 原文: [https://javabeginnerstutorial.com/selenium/9p-webdriver-shortcut-locator-validation/](https://javabeginnerstutorial.com/selenium/9p-webdriver-shortcut-locator-validation/)
......
# 9 WebDriver – 断言和验证
# 9R WebDriver – 断言和验证
> 原文: [https://javabeginnerstutorial.com/selenium/9r-webdriver-assert-and-verify/](https://javabeginnerstutorial.com/selenium/9r-webdriver-assert-and-verify/)
嗨呀超级巨星! 我们已经定位元素很多天了。 让我们今天换一下话题,谈谈“确认和验证”。
### 要记住
### 要记住
当“条件/检查”的断言或验证**失败**时,两者之间的主要区别是:
......@@ -19,7 +19,7 @@
大多数情况下,我们希望在检查失败时停止测试执行,而这正是我们通过断言得到的结果。 测试用例失败,并且清楚地突出显示为“失败”。 这将立即向我们显示哪些测试用例没有通过完整测试套件中的检查。 然后,我们可以直接转到那些失败的案例,并检查检查/条件未通过的原因。 那不是很方便吗? 由于此*立即反馈*的可用性,因此断言更为常用。
### 断言的缺点
### 使用断言的缺点
当第一个断言条件失败时,将不再执行以下代码行。 可能还要执行其他检查,我们永远不会知道他们的结果。
......
# 9 WebDriver – 处理单选按钮和复选框
# 9T WebDriver – 处理单选按钮和复选框
> 原文: [https://javabeginnerstutorial.com/selenium/9t-webdriver-handling-radio-buttons-checkboxes/](https://javabeginnerstutorial.com/selenium/9t-webdriver-handling-radio-buttons-checkboxes/)
......@@ -64,7 +64,7 @@ driver.findElement(By.name("vehicle2")).isDisplayed();
## 3\. **检查单选按钮/复选框是否已启用,以便可以选择它**
同样,为了验证是否启用了特定的单选按钮或复选框,我们有 isEnabled()方法。 这还会返回一个布尔值( `true` – 元素已启用,`false` – 元素已禁用)。
同样,为了验证是否启用了特定的单选按钮或复选框,我们有`isEnabled()`方法。 这还会返回一个布尔值( `true` – 元素已启用,`false` – 元素已禁用)。
**示例**:让我们检查是否启用了“Tricycle”复选框。 如果是的话,让我们检查一下,否则我们只会在控制台上打印一条消息。
......@@ -144,7 +144,7 @@ for (int i = 0; i < 2; i++) {
此代码将在第一个迭代中选中“轿车”复选框,然后在第二个迭代中取消选中它。 选择状态消息将相应地打印到控制台。
## 总体图片
## 概览
让我们来看一个测试案例,该案例实现了迄今为止本文中涵盖的所有操作,
......
......@@ -106,7 +106,7 @@ languages.selectByVisibleText("JavaScript");
languages.deselectByVisibleText("JavaScript");
```
### 2\. `selectByValue(String arg0)`和`deselectByValue(String arg0_`
### 2\. `selectByValue(String arg0)`和`deselectByValue(String arg0)`
这些方法选择和取消选择其`value`属性与传递的`String`参数匹配的选项。
......@@ -207,7 +207,7 @@ List<WebElement> allOptions = multiSelect.getOptions();
List<WebElement> allSelectedOptions = multiSelect.getAllSelectedOptions();
```
## 总体图片
## 概览
让我们来看一个测试案例,该案例实现了迄今为止本文中涵盖的所有操作,
......
......@@ -59,7 +59,7 @@ System.out.println("Inner table first row text = " + innerRow1.getText());
WebElement innerRow2 = driver.findElement(By.xpath("//table/tbody/tr[1]/td[2]/table/tbody/tr[2]/td[1]"));
```
## 总体图片
## 概览
让我们一步一步地查看上面讨论的方法的代码!
......
# 9 WebDriver – 遍历表元素
# 9W WebDriver – 遍历表元素
> 原文: [https://javabeginnerstutorial.com/selenium/9w-webdriver-looping-table-elements/](https://javabeginnerstutorial.com/selenium/9w-webdriver-looping-table-elements/)
......
# 9 倍。 WebDriver – 处理警报/弹出框
# 9X WebDriver – 处理警报/弹出框
> 原文: [https://javabeginnerstutorial.com/selenium/9x-webdriver-handling-alerts-popup-box/](https://javabeginnerstutorial.com/selenium/9x-webdriver-handling-alerts-popup-box/)
......@@ -20,7 +20,7 @@ window.alert("This is a simple alert box! \nYou can't escape from me until you c
![Alert Box](img/ef37d2f8b6773bd5e6f2e813f2a9c463.png)
## 2\. **确认框**
## 2\. 确认框
确认框为用户提供了两个选项,以验证/接受或关闭某些内容。 用户必须单击“确定”或“取消”才能继续。 确认弹出框返回布尔值。 当用户点击“确定”时返回`true`,而当点击“取消”时返回`false`
......@@ -32,7 +32,7 @@ window.confirm("Click 'OK' or 'Cancel'.");
![Confirm Box](img/eb42ced4a961c35a4e35d860b23ca096.png)
## **3\. 提示框**
## 3\. 提示框
在我们希望用户输入值的情况下,将使用提示框。 与其他警报框类似,用户必须单击“确定”或“取消”按钮才能继续操作。 提示框在单击“确定”时返回输入值,而在单击“取消”时返回空值。
......@@ -46,7 +46,7 @@ window.prompt("Which Selenium Tool do you like the most?","e.g. Selenium IDE");
希望您现在对基于 Web 的弹出窗口的不同类型有清楚的了解。
## **处理弹出框:**
## 处理弹出框:
Selenium WebDriver 尚未提供任何处理这些弹出框的方法。 你相信我刚才说的吗?
......@@ -78,7 +78,7 @@ driver.switchTo().alert().accept();
driver.switchTo().alert().dismiss();
```
### 4\. `字符串 getText()`
### 4\. `String getText()`
要使文本显示在弹出框中,请使用此方法,它将文本作为字符串返回。
......@@ -94,7 +94,7 @@ driver.switchTo().alert().getText();
driver.switchTo().alert().sendKeys(sampleText);
```
## **场景**
## 场景
让我们来看一个实现这些方法的测试用例,以更深入地了解这些概念,
......
# 9 WebDriver – 处理多个窗口
# 9Y WebDriver – 处理多个窗口
> 原文: [https://javabeginnerstutorial.com/selenium/9y-webdriver-handling-multiple-windows/](https://javabeginnerstutorial.com/selenium/9y-webdriver-handling-multiple-windows/)
......@@ -28,7 +28,7 @@ String parentWinHandle = driver.getWindowHandle();
Set<String> winHandles = driver.getWindowHandles();
```
可以使用分配给每个打开的窗口的唯一句柄的引用,使用相同的`switchTo()`方法从一个窗口切换到另一窗口。 为了更好地了解`switchTo()`[请单击此处](https://javabeginnerstutorial.com/selenium/9x-webdriver-handling-alerts-popup-box/)
可以使用分配给每个打开的窗口的唯一句柄的引用,使用相同的`switchTo()`方法从一个窗口切换到另一窗口。 为了更好地了解`switchTo()`[请单击此处](https://javabeginnerstutorial.com/selenium/9x-webdriver-handling-alerts-popup-box/)
## 场景
......
......@@ -17,7 +17,7 @@
让我们通过几个简单的步骤来理解这一点。
## **步骤 1:**
## 步骤 1:
导入以下包,`import org.openqa.selenium.JavascriptExecutor;`
......@@ -28,7 +28,7 @@
JavascriptExecutor jsExecutor = (JavascriptExecutor)driver;
```
## **步骤 2:**
## 步骤 2:
这样创建的`JavascriptExecutor`对象允许我们从 Selenium 测试中执行 JavaScript 代码。
......@@ -39,11 +39,11 @@ jsExecutor.executeScript("window.scrollBy(0,100)");
此“`excuteScript`”方法采用两个参数。 第一个是 JavaScript 代码,第二个是 Java 脚本代码所需的可选参数列表。
## **总体图片**
## 概览
让我们看一个测试案例,实现到目前为止所介绍的技术,
### *场景*
### 场景
1. 打开 Firefox 浏览器
2. 导航到演示站点([https://chandanachaitanya.github.io/selenium-practice-site/](https://chandanachaitanya.github.io/selenium-practice-site/)
......@@ -116,7 +116,7 @@ public class JavaScriptExecutorTest {
}
```
### *执行结果:*
### 执行结果:
为每行代码提供了注释,使其易于说明。
......
......@@ -4,7 +4,7 @@
灯光,摄像头,动作! 是的,今天所有有关动作的内容。 哦,我不是在谈论您在电影中观看的那些战斗顺序,而是在谈论键盘和鼠标的动作。 Selenium WebDriver 提供了一个面向用户的 API,用于执行复杂的用户手势。 我们到处都希望自动化! 因此,除了直接使用键盘和鼠标,我们还可以使用`Actions`类来执行基本的`click``sendKeys`和复杂的操作,例如`dragAndDrop`等。
## 一些可用的键盘和鼠标方法是
## 一些可用的键盘和鼠标方法是
### 1\. `click(WebElement target)`
......@@ -78,7 +78,7 @@
说明:在当前鼠标位置释放按下的鼠标左键。
## 总体图片
## 概览
让我们看一个测试案例,实现我们刚才讨论的一些方法,
......
......@@ -4,7 +4,7 @@
嗨冠军! 报告,报告,无处不在的报告。 从哈利·波特时代开始,我们就一直在处理这些问题!! (还记得学校的进度报告吗?!)无论如何,报告真的很重要,尤其是在测试中,以便快速了解一切工作原理。
因此,今天,我们将使用 Apache ANT 的`junitreport`任务来生成一个任务。 准备点亮
因此,今天,我们将使用 Apache ANT 的`junitreport`任务来生成一个任务。 热身
从我的[上一篇文章](https://javabeginnerstutorial.com/selenium/10a-advanced-webdriver-apache-ant/)中,我们生成了带有“`junit`”作为默认 JUnit 输出目录的构建文件。 用简单的英语来说,这仅意味着将作为 JUnit 报告任务的一部分生成的所有文件都放置在名为“`junit`”的目录下。
......@@ -14,7 +14,7 @@
![Package structure](img/bbbccea0a3928f2e18e1c51e8230d1e6.png)
#### **步骤 2**
#### 步骤 2
打开“`build.xml`”,并确保自动生成“`junitreport`”任务。 以下是我的项目的目标(初始化,清理,构建,`RadioBtns_Checkboxes``SelectItems``junitreport`)。
......@@ -74,7 +74,7 @@
</project>
```
#### **步骤 3**
#### 步骤 3
可以通过以下任意一种方式执行构建,
......@@ -104,13 +104,13 @@
![ANT target configuration](img/8af13d9bb45d3942d6d51b53f17f884f.png)
#### **步骤 4**
#### 步骤 4
可以通过查看控制台视图来验证成功执行。 它显示了按配置顺序执行的所有目标以及基于构建文件中提到的日志记录级别的日志。 如图所示,将显示运行构建所花费的总时间以及消息“`BUILD SUCCESSFUL`”或“`BUILD FAILED`”。
![Console Output](img/0fb58b99d8612d1dccb306cceb89eba4.png)
#### **步骤 5**
#### 步骤 5
在 Eclipse 的“包浏览器”视图中,右键单击该项目,然后单击“刷新”或`F5`。 已经创建了“`junit`”文件夹(在生成构建文件时在“JUnit 输出目录”框中指定的名称)。 这是 JUnit 报告(`index.html`)和 XML 一起提供的地方,用于执行的每个测试用例,显示其成功或失败。
......@@ -118,7 +118,7 @@
或者,在文件浏览器中导航到项目路径,然后双击“`junit`”文件夹。
#### **步骤 6**
#### 步骤 6
在浏览器中打开“`index.html`”,并检查生成的默认报告。 这将在左窗格中显示所涉及的包和所有已执行的 Java 文件。
......
# 10C 先进的 WebDriver – JUnit 报表自定义
# 10C 高级 WebDriver – JUnit 报表自定义
> 原文: [https://javabeginnerstutorial.com/selenium/10c-advanced-webdriver-junit-report-customization/](https://javabeginnerstutorial.com/selenium/10c-advanced-webdriver-junit-report-customization/)
......@@ -131,7 +131,7 @@ Apache ANT 的`JunitReport`任务通过执行以下步骤来生成报告,
![Title after customization](img/79f7da90cc8512a6f3a09a33020e5481.png)
## **增加栈跟踪字体大小**
## 增加栈跟踪字体大小
我们在发生故障时看到的栈跟踪信息非常小,很难读取。 为了增加其字体大小,只需在模板中添加几行名称为`stylesheet.css`的行即可。
......
# 10D 高级 WebDriver – JUnit 报告自定义续
# 10D 高级 WebDriver – JUnit 报告自定义续
> 原文: [https://javabeginnerstutorial.com/selenium/10d-advanced-webdriver-junit-report-customization-part2/](https://javabeginnerstutorial.com/selenium/10d-advanced-webdriver-junit-report-customization-part2/)
......@@ -106,7 +106,7 @@ table.details tr th{
我知道,它看起来并不吸引眼球,但我们证明了我们想要的。 所以,你去了!
## **在标头部分**中添加徽标
## 在标头部分中添加徽标
我们大多数人都喜欢生成的报告上的徽标。 谁不喜欢个性化和一点营销? 如果您懂一点 HTML,就非常简单。 在名为“`pageHeader`”的模板上,添加一个图像标签,并在`src`属性中指定路径。 我已将徽标图像放置在生成`index.html`文件的项目的“`junit`”文件夹中。
......@@ -124,7 +124,7 @@ table.details tr th{
</xsl:template>
```
### *结果*
### 结果
![Adding a Logo](img/4d78e6dc472ceb1d9f1e11333fc47113.png)
......
......@@ -16,7 +16,7 @@
将文件内容解压缩到本地文件夹并记下路径。 另外,请确保分发中包含“`build-junitpdfreport.xml`”文件和“`lib`”文件夹以及某些其他文件和文件夹。
## **步骤 2:**
## 步骤 2:
是时候在 Eclipse IDE 中浏览“`Build.xml`”文件了。 有几行要添加。 首先要做的是告诉我们的项目,该`junitpdfreport`基本 zip 文件的内容在哪里提取。 在构建文件的`project`标签中,将以下行及其路径添加到分发位置。
......@@ -24,7 +24,7 @@
<!-- JUnit PDF report installation location --> <import file="E:/junitpdfreport_essentials_1_0/build-junitpdfreport.xml"/>
```
## **步骤 3:**
## 步骤 3:
将以下目标也添加到构建文件中,以便 ANT 知道该怎么做。
......@@ -44,7 +44,7 @@
就我而言,我有以下测试文件:`TEST-com.blog.junitTests.RadioBtns_Checkboxes.xml``TEST-com.blog.junitTests.SelectItems.xml``TESTS-TestSuites.xml`保存在位置`junit/`
## **步骤 4:**
## 步骤 4:
右键单击并选择“2 ANT Build”,然后在“编辑配置”弹出窗口中选中“目标”标签。 确保已选中“pdfReport”目标,它是执行顺序中提到的最后一个目标。
......@@ -52,7 +52,7 @@
点击“运行”以执行构建文件。
## **步骤 5:**
## 步骤 5:
在指定的输出目录(本例中为“`junit/`”)中验证生成的 PDF 报告。
......
......@@ -19,7 +19,7 @@
TakesScreenshot screenshot = (TakesScreenshot) driver;
```
## 第 2 步
## 步骤 2
要将屏幕截图获取为图像文件,请调用“`getScreenshotAs`”方法。
......@@ -79,14 +79,14 @@ public static String timestamp() {
在我们的示例中,我们将使用复杂的版本。 因为我们要将所有与屏幕快照相关的代码放在一个单独的方法中(在新类中),并在每次我们希望捕获屏幕快照时调用它。 否则,我们将不得不为每种情况做相同的歌舞。
## 总体图片
## 概览
使用两种方法创建一个名为“`SaveScreenshot.java`”的新类。
1. `public static void capture(String testCaseName, WebDriver driver)` – 具有捕获屏幕快照并将其保存到所需位置的所有代码。
2. `public static String timestamp()` – 用于生成时间戳并将其提供给上述方法,以使每个保存的屏幕截图都是唯一的。
## 样本场景
## 示例场景
1. 打开 Firefox 浏览器。
2. 导航到 Google 帐户创建页面
......
......@@ -11,7 +11,7 @@
## 代码
#### SendMail.java
#### `SendMail.java`
```java
package com.blog.utility;
......@@ -107,7 +107,7 @@ public class SendMail {
}
```
#### InvokeMail.java
#### `InvokeMail.java`
```java
package com.blog.junitTests;
......
......@@ -18,7 +18,7 @@
![Folder Structure](img/b6caa2e423b83a552625a195bf5ccbf3.png)
## **步骤 2:**
## 步骤 2:
现在是时候从测试用例中提取所有这些硬编码的值了。
......@@ -26,7 +26,7 @@
![property file](img/30192b906e750b66936d351b54584625.png)
## **步骤 3:**
## 步骤 3:
为了在测试案例中使用这些属性,
......@@ -46,11 +46,11 @@
`props.getProperty("baseURL");` – 要获取特定属性的值,请使用“`getProperty`”方法。 将在双引号中提及相应的键作为 `getProperty()`方法的参数。 它使用属性列表中的指定键搜索属性。 如果找不到密钥,则返回`null`
## **总体图片**
## 概览
让我们看一个测试案例,实现到目前为止所涵盖的概念,
### ***场景***
### 场景
1. 打开 Firefox 浏览器。
2. 从属性文件中读取 firefox 驱动程序路径和基本 URL。
......@@ -66,7 +66,7 @@
验证 Eclipse IDE 控制台输出屏幕和 JUnit 窗格是否成功
### **此方案的 JUnit 代码**
### 此方案的 JUnit 代码
**`Config.properties`**
......@@ -211,7 +211,7 @@ public class RadioBtns_Checkboxes {
}
```
## **输出**
## 输出
每行代码都提供了清晰的注释,使其易于说明。 执行测试用例后,eclipse IDE 控制台窗口的输出如下,
......
......@@ -14,13 +14,13 @@
![POI download link](img/66dde6eb58d06604bfe3993478f8010c.png)
## **步骤 2:**
## 步骤 2:
将这些 JAR 添加到我们的项目构建路径中。 确保选择“`poi-x.xx`”,“`ooxml-lib`”和“`lib`”文件夹下的所有 JAR。 我还将这些以及其他所有代码文件都放在了我们的 [GitHub 仓库](https://github.com/JBTAdmin/Selenium/tree/master/AdvancedWebDriver/Reading%20data%20from%20excel)中。
我们之前已经多次看到这种添加 JAR 来构建路径过程的内容,因此我没有在重复它(有关详细说明,请参阅此[文章](https://javabeginnerstutorial.com/selenium/9b-webdriver-eclipse-setup/)的步骤 3)。
## **步骤 3:**
## 步骤 3:
创建一个新类“`ExcelOperationsUsingPOI.java`”。 在此类中,让我们有一种从特定位置读取 excel 文件的特定图纸的方法。
......@@ -53,7 +53,7 @@ else if(fileExtensionName.equals(".xls")){
现在让我们来看一下实现到目前为止讨论的全部功能的代码,
### **`ExcelOperationsUsingPOI.java`**
### `ExcelOperationsUsingPOI.java`
```java
import java.io.File;
......@@ -114,7 +114,7 @@ public class ExcelOperationsUsingPOI {
}
```
### **`ReadExcelData.java`**
### `ReadExcelData.java`
用于调用`readExcel`方法并传递必需的参数。
......
......@@ -4,7 +4,7 @@
现在让我来解释一下使用 Apache Log4j 记录 Selenium 的过程! 因此,事不宜迟,让我们开始吧!
## 为什么我们需要首先登录
## 为什么我们需要日志
作为自动化测试人员,我们负责故障排除,调试等。 记录使整个过程变得非常容易! 它带给我们这些神奇的“眼睛”,让我们看到许多事物,例如,
......
# 教程视图
\ No newline at end of file
# Vue 教程
\ No newline at end of file
......@@ -76,9 +76,9 @@ Chrome 浏览器中的当前输出如下,
到目前为止和我在一起? 好的,我听到您说我们已经渲染了“`Hello World!`”带有`<h1>`标签,但这与我们使用 Vue.js 进行显示的最初目标不矛盾吗? **好问题。**
## **让我们现在回答,**
## 让我们现在回答
### **步骤 1:创建新的 Vue 实例**
### 步骤 1:创建新的 Vue 实例
我们已经使用`<script>`标签将 Vue.js 导入了我们的项目,但这并不能解决问题。 这相当于在我们的工作台上有一台笔记本电脑。 要打开它并完成一些工作,我们必须按下电源按钮。 同样,要在我们的项目中使用 Vue,我们必须使用`new`关键字创建 Vue 对象的实例。 这个实例是 Vue 的电源按钮!
......@@ -86,7 +86,7 @@ Chrome 浏览器中的当前输出如下,
new Vue();
```
### **步骤 2:传递选项对象**
### 步骤 2:传递选项对象
仅创建实例只会为 Vue 供电。 但是我们想对 Vue 做更多的。 为此,我们必须将选项或配置对象作为参数传递给刚创建的实例。 此选项对象具有 Vue 可以识别的一些保留属性,它们被指定为**键值对**。 顾名思义,并非所有属性都是必需的,可以在需要时指定。 通常,它们用于存储数据和执行某些操作。
......@@ -96,7 +96,7 @@ new Vue();
new Vue({ options/config object });
```
### **步骤 3:建立与 DOM 的连接**
### 步骤 3:建立与 DOM 的连接
我们希望以某种方式获取对我们希望操纵的一部分 HTML 代码的控制。 在我们的示例中,它是带有`id`和“`app`”的`<div>`元素,因此我们可以通过 Vue 显示消息“Hello World”。
......@@ -108,7 +108,7 @@ new Vue({ el: "#app" });
通过此简单的代码行,我们现在将带有`id``<div>`元素,“`app`”及其内容链接到 Vue 实例。 它们现在*不可分割*
### **步骤 4:指定我们的数据**
### 步骤 4:指定我们的数据
为了存储我们要在此 Vue 实例及其链接的 DOM 中使用的所有数据/信息,我们还有一个保留的属性,称为“`data`”。 与“`el`”不同,“`data`”将对象作为其值。 由于我们要向 DOM 显示消息“`Hello World`”,因此让我们在“数据”对象中将其指定为键值对。
......@@ -116,7 +116,7 @@ new Vue({ el: "#app" });
new Vue({ el: "#app", data: { message: "Hello World" } });
```
### **步骤 5:将此数据呈现到 DOM**
### 步骤 5:将此数据呈现到 DOM
只需使用如下所示的两个大括号即可将 Vue 实例的数据对象中指定的值呈现到 DOM。 (有关更多信息,请参阅下一篇文章!)
......
# 2.模板语法和反应式的一瞥
# 2.模板语法和反应式的初探
> 原文: [https://javabeginnerstutorial.com/js/vue-js/2-template-syntax-reactivity/](https://javabeginnerstutorial.com/js/vue-js/2-template-syntax-reactivity/)
......@@ -35,7 +35,7 @@ var app = new Vue({
![Vue.js output](img/6db1fd39a9ccc23d42cc746ed9c95ad8.png)
## **一窥 Vue 的反应式**
## 初探 Vue 的反应式
如果您认为使用模板语法进行渲染本身很棒,那么就准备惊讶吧! 因为 Vue 是**反应式**
......@@ -50,7 +50,7 @@ var app = new Vue({
![reactivity in action](img/a5f2cebad59f4377dc2a4483d01e4f09.png)
### **注意:**
### 注意:
*您也可以这样做`app.$data.message = "Hey Vue, what's up?"`*
......
# 3\. View 指令简介
# 3\. Vue 指令简介
> 原文: [https://javabeginnerstutorial.com/vue-js/3-vue-directives/](https://javabeginnerstutorial.com/vue-js/3-vue-directives/)
......@@ -28,7 +28,7 @@ Vue 带有一些内置指令。 请注意,我们可以编写自己的自定义
* 显示标题和
* 显示带有问候消息的段落,例如“嗨!”
### Index.html
### `Index.html`
```java
<html>
......@@ -48,7 +48,7 @@ Vue 带有一些内置指令。 请注意,我们可以编写自己的自定义
</html>
```
### Index.js
### `Index.js`
```java
var app = new Vue({
......
......@@ -14,7 +14,7 @@
点击显示的第一个建议“`vue devtools`”,或仅按“`Enter`”。
## **步骤 2:**
## 步骤 2:
点击“添加到 Chrome 浏览器”按钮,如下图所示。
......@@ -24,7 +24,7 @@
![Devtools add confirmation](img/7792dae54eeb1af22e79a5dc410258b9.png)
### **步骤 3:**
### 步骤 3:
添加扩展名后,您会注意到一条确认消息以及一个小的快捷方式,如下所示。
......
......@@ -20,7 +20,7 @@
使用`v-html`指令会将`<span>`标记的内容替换为`vueLink`数据属性的值,并将其解释为纯 HTML。 因此,超链接以指定的绿色显示。
## **使用 JavaScript 表达式**
## 使用 JavaScript 表达式
双花括号以及显示纯文本还可以求值**单个** JavaScript 表达式。
......
......@@ -14,11 +14,11 @@
在这种情况下,使用`v-bind`指令告诉 Vue.js 将`data`属性的值绑定到该指令后面的属性名称。
### **语法,**
### 语法,
`v-bind:html_attribute=”data_to_be_bound`
### **示例,**
### 示例,
`v-bind:href="vueLink"`
......@@ -28,7 +28,7 @@
奇迹般有效! 单击呈现的链接将打开一个新标签,该标签具有预期的指定链接。
## **其他示例场景**
## 其他示例场景
1. 在网页上动态显示图片,即,当在 Vue 实例的数据对象中更改图片位置时,应该在网页上自动更新图片。
2. 根据绑定到该字段的数据值启用或禁用输入字段。
......
......@@ -10,7 +10,7 @@ Vue **指令**再来一次! 在这方面,我们有`v-if`,`v-else`和`v-els
![](img/14aaafae94bb48d942bd3f553d948bfd.png)
## **1\. `v-if`指令**
## 1\. `v-if`指令
使用`v-if`指令的语法如下:
......@@ -40,7 +40,7 @@ data: { message: "Hi", display: false }
![conditional rendering v-if](img/b81014dd6939b1699e77e2dc0eef84b9.png)
## **2\\. `v-else`指令**
## 2\\. `v-else`指令
假设您要在显示为`true`时显示第一个`<p>`标签,并在显示结果为`false`时显示第二个`<p>`标签。 在这种情况下,我们可以使用`v-else`指令。 它类似于`else`块。
......@@ -61,7 +61,7 @@ data: { message: "Hi", display: false }
可以在`<div>``<template>`等帮助下将这些指令添加到单个 HTML 元素或元素块中。考虑一种情况,您希望根据条件显示错误消息。 在这种情况下`if-else`块会派上用场。
## **3\. `v-else-if`指令**
## 3\. `v-else-if`指令
它也与`v-if`元素一起使用。 该指令充当“`else-if`”条件。 与其他任何编程语言一样,它可以链接多次。
......
......@@ -40,11 +40,11 @@ data: {
**注意:** *当`v-if`条件的值为`false`时,整个元素将从 DOM 中分离/删除。 当在我们的应用中不需要某个元素时,这通常是首选的行为,因为 DOM 中包含较少的元素会提高其性能。*
## **`v-show`指令**
## `v-show`指令
作为开发人员的生活是如此变幻莫测! 我们经常遇到需要频繁显示和隐藏元素的情况,即在网页上打开和关闭。 在这种情况下,最好使用`v-show`指令。
### **使用`v-show`的原因**
### 使用`v-show`的原因
该指令将确保 DOM 中始终存在**元素**。 将显示条件是否为真(求值为`true`)。 当条件求值为`false`时,该元素将通过自动添加 CSS 属性`display: none`来隐藏! 听起来不有趣吗?
......@@ -60,7 +60,7 @@ data: {
让我们将`display`属性的值更改为`false`。 我们完整的代码如下所示:
#### *`Index.js`*
#### `Index.js`
```javascript
var app = new Vue({
......@@ -71,7 +71,7 @@ var app = new Vue({
});
```
#### *`Index.html`*
#### `Index.html`
```html
<!DOCTYPE html>
......@@ -104,11 +104,11 @@ var app = new Vue({
1. 具有`v-if`伪指令的`<template>`元素(包含`<h1>``<p>`元素)在求值为`false`时,已从 DOM 中删除了。
2. 仅具有`v-show`指令的第二个`<p>`元素**使用 CSS `display`属性切换元素的可见性**。 元素始终附加到 DOM,并且始终显示。 它只是变得不可见。 就这样!
### **当心!**
### 当心!
由于不支持将`v-show``<template>`元素一起使用,因此无法使用。 另外,它不适用于`v-else``if``else`是灵魂伴侣,你知道吗?!不是,`show``else`!)
### **那么,我应该使用`v-if`或`v-show`吗?**
### 那么,我应该使用`v-if`或`v-show`吗?
好问题! 如果您想**切换**,通常将**经常切换**,因为 DOM 中始终存在该元素,请使用`v-show`,无论初始条件是否为`true``false`。 借助 CSS `display`属性只能切换可见性。 因此,初始渲染成本较高。
......
......@@ -47,7 +47,7 @@ data: {
将呈现相同的结果。
## **Vue 是反应式的!**
## Vue 是反应式的!
让我们沿着存储通道走一下。 我们了解到 Vue 的美丽在于其[反应式](https://javabeginnerstutorial.com/js/vue-js/2-template-syntax-reactivity/)
......@@ -71,7 +71,7 @@ $vm0.greetings.push("namaste")
这不是魔术吗?
## **访问当前数组项的索引**
## 访问当前数组项的索引
开发者的生活没有暂停按钮! 我们期望完成意外的事情,例如访问数组项的索引及其内容。 我们知道如何使用 Vue 渲染数组元素,但是否也可以获得其索引? 好吧,答案是肯定的!
......
......@@ -151,13 +151,13 @@ methods: {
最常用的修饰符是`.stop``.prevent`,它们称为众所周知的`event.stopPropagation()``event.preventDefault()`方法。 这些是[本机事件对象](https://www.w3schools.com/jsref/obj_event.asp)随附的方法。 这里与 Vue 无关。 Vue.js 只是提供了一种简单的方法,借助修饰符来处理此类常见事件详细信息,而不是在 Vue 实例的方法中显式指定这些事件方法(例如`event.preventDefault()`来取消事件)。
### **两个最常用修改器的快速刷新:**
### 两个最常用修改器的快速刷新:
根据`stopPropagation()`事件方法,`.stop`修饰符将进一步停止事件的传播。
根据`preventDefault()`方法,`.prevent`修饰符将防止发生默认操作。 `.prevent`的最佳示例是将其与`Submit`按钮一起使用,以便触发提交事件时,它不会重新加载页面。
### **链接修饰符**
### 链接修饰符
*警告:一开始可能会有些弯腰!*
......
......@@ -72,7 +72,7 @@ stu2 = Student(“Reema” , 12) //second object of student class
属性
属性是对象的特征。 _init_()方法用于初始化对象的属性。 要访问对象的属性,我们对对象使用点运算符。 喜欢
属性是对象的特征。 `__init__()`方法用于初始化对象的属性。 要访问对象的属性,我们对对象使用点运算符。 喜欢
```java
stu1.displayStudent( )
......
......@@ -102,8 +102,8 @@ TypeError: 'float' object is not iterable
迭代器必须:
* 创建时将其设置为循环。
* 实现必须返回下一项的`__next __()`方法
* 循环结束时,`__next__()`方法还必须引发`StopIteration()`异常。
* 实现必须返回下一项的`__next __()`方法
* 循环结束时,`__next__()`方法还必须引发`StopIteration()`异常。
通常,迭代器对象使用存储在其属性之一中的循环计数器或类似计数器来跟踪其位置。 这是一个如何在实践中使用的示例:
......@@ -132,7 +132,7 @@ TypeError: 'float' object is not iterable
* 连接生成器(`yield from`表达式)
* 并发/并行处理/协程
在本文结尾处的一些参考文献中对它们进行了介绍,但是为了对所有这些概念进行很好的介绍,强烈建议特别使用 [Dave Beazley 的](http://www.dabeaz.com/generators-uk/)演示文稿
在本文结尾处的一些参考文献中对它们进行了介绍,但是为了对所有这些概念进行很好的介绍,强烈建议特别使用 [Dave Beazley 的](http://www.dabeaz.com/generators-uk/)PPT
## 实现生成器
......
......@@ -2,7 +2,7 @@
> 原文: [https://javabeginnerstutorial.com/core-java-tutorial/history-of-java/](https://javabeginnerstutorial.com/core-java-tutorial/history-of-java/)
Java 是一种通用的通用计算机编程语言,它是基于环境的,基于类的,面向对象的,并且经过专门设计以尽可能减少应用依赖性。 Java 最初是为交互式电视开发的,但是对于当时的数字有线电视行业来说,它是太先进的技术。 建议让应用开发人员“编写一次,就可以在任何地方运行”,这表明已编译的 Java 代码可以在纵容 Java 的所有平台上运行,而无需重新编译。 Java 应用被编译为可以在任何 Java 虚拟机([JVM](https://javabeginnerstutorial.com/core-java-tutorial/jdk-vs-jre-vs-jvm/))上运行的字节码,而与计算机的体系结构无关。
Java 是一种通用的通用计算机编程语言,它是基于环境的,基于类的,面向对象的,并且经过专门设计以尽可能减少应用依赖性。 Java 最初是为交互式电视开发的,但是对于当时的数字有线电视行业来说,它是太先进的技术。 建议让应用开发人员“编写一次,就可以在任何地方运行”,这表明已编译的 Java 代码可以在纵容 Java 的所有平台上运行,而无需重新编译。 Java 应用被编译为可以在任何 Java 虚拟机([JVM](https://javabeginnerstutorial.com/core-java-tutorial/jdk-vs-jre-vs-jvm/))上运行的字节码,而与计算机的构无关。
Java 包罗万象,但事实并非如此。 它毫不费力地开始。 这一切始于 1990 年,当时 Sun Microsystems 工程师 Patrick Naughton 对 Sun 的 C++ 和 C API 的情况更加恼火,并有机会作为 The Stealth Project 的一部分来创建替代语言。
......
......@@ -8,7 +8,7 @@ Java SE 9 于 2017 年 9 月发布。它包含一长串功能,包括模块化
它将为 Java 语言的发展增加一个独特的阶段,并使 JDK 团队可以更快地进行修改和创新。 由于 Java 9 是 Java 10 继而的短期加速发布版本,因此 Java 9 已停止获取更新。
此版本的 Java 具有一些基本的体系结构更改,并且进行了许多改进。
此版本的 Java 具有一些基本的构更改,并且进行了许多改进。
## Java 9 功能包括
......
......@@ -33,7 +33,7 @@ Java 10 由各种新功能和对许多功能领域的改进组成。 它的一
8. 将提供三个新的 JVM 选项,以使 Docker 容器用户对系统内存有更大的控制权。
9. 局部变量类型推断:将增强语言以将类型推断扩展到局部变量。 目的是减少与编码关联的“仪式”,同时保留对非活动类型安全性的承诺。
10. Graal 是一种创新的即时编译器,可以应用于 Linux/x64 平台。
11. 在 HotSpot 的帮助下,它将允许在用户指定的替代存储设备(例如 NVDIMM 内存模块)上指定对象堆。 由于此特性,可以预见,未来的系统可能会具有复杂的内存体系结构。
11. 在 HotSpot 的帮助下,它将允许在用户指定的替代存储设备(例如 NVDIMM 内存模块)上指定对象堆。 由于此特性,可以预见,未来的系统可能会具有复杂的内存构。
#### Oracle 的 Java 团队声明不可能:
......
......@@ -11,7 +11,7 @@
![](img/84ced9a2cb730f97cce54806e6a7946b.png)
**Java 虚拟机的体系结构**
**Java 虚拟机的构**
* 所有的 JVM 都包含两个组成部分
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册