提交 eb8b4942 编写于 作者: W wizardforcel

2020-06-24 12:35:03

上级 87f339a5
......@@ -15,9 +15,9 @@ WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.id("e
因此,`WebDriverWait`类用于指定最大超时值,在这种情况下为 15 秒。 `ExpectedCondition`类的方法涵盖了我们希望在测试中出现之前要等待的大多数条件。 这些条件与`WebDriverWait`一起使用。
上面的代码一直等到元素变为可点击(即显示并启用)并返回结果。 默认情况下,WebDriverWait 每 500 毫秒调用 ExpectedCondition,直到成功返回。 在这种情况下,它会在抛出 TimeoutException 之前尝试长达 15 秒。 成功的返回值是布尔值 true 或非 null 对象。
上面的代码一直等到元素变为可点击(即显示并启用)并返回结果。 默认情况下,`WebDriverWait`每 500 毫秒调用`ExpectedCondition`,直到成功返回。 在这种情况下,它会在抛出`TimeoutException`之前尝试长达 15 秒。 成功的返回值是布尔值`true`或非`null`对象。
ExpectedCondition 预定义方法的一些示例是,
`ExpectedCondition`预定义方法的一些示例是,
* `elementToBeClickable(By locator)` – 用于检查元素的期望是可见的并已启用,以便您可以单击它。
* `elementToBeSelected(WebElement element)` - 检查是否选择了给定元素。
......@@ -25,13 +25,13 @@ ExpectedCondition 预定义方法的一些示例是,
* `urlToBe(java.lang.String url)` – 检查当前页面的 URL 是一个特定的 URL。
* `visibilityOf(WebElement element)` - 用于检查存在于页面的 DOM 上的已知元素的是可见的。
您可以在[此处](https://seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/support/ui/ExpectedConditions.html),找到适用于 Java 的 ExpectedConditions 包的所有可用方法及其用法的详细信息。
您可以在[此处](https://seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/support/ui/ExpectedConditions.html),找到适用于 Java 的`ExpectedConditions`包的所有可用方法及其用法的详细信息。
**注意**:根据 [Selenium 的官方文档](http://docs.seleniumhq.org/docs/04_webdriver_advanced.jsp#explicit-and-implicit-waits),我们警告您不要混合使用隐式和显式等待,因为这可能会导致不可预测的等待时间。
### 流利的等待
谁不喜欢自定义? 对于显式等待,如果这是您要搜索的内容,那么我建议您使用 Fluent Wait。 我们可以通过流畅的等待来配置以下内容,
谁不喜欢自定义? 对于显式等待,如果这是您要搜索的内容,那么我建议您使用流利的等待。 我们可以通过流畅的等待来配置以下内容,
* 在抛出异常之前我们希望等待(超时)条件发生的最长时间,
* 检查指定条件的频率,以及
......@@ -53,19 +53,19 @@ public WebElement fluentWait(final By locator) {
}
```
在这里,我们声明超时值为 20 秒的流畅等待,每 2 秒(频率)轮询 DOM 直到找到元素为止,并在此时间间隔内忽略 NoSuchElementException。 我们在上面的代码片段中创建了一个新函数,以在.until();中标识此 Web 元素。
在这里,我们声明超时值为 20 秒的流畅等待,每 2 秒(频率)轮询 DOM 直到找到元素为止,并在此时间间隔内忽略`NoSuchElementException`。 我们在上面的代码片段中创建了一个新函数,以在`.until()`中标识此 Web 元素。
#### 有几点值得您花时间,
1. 与隐式等待不同,此方法适用于 findElement(s)以及您可能会想到的在自动化网页时进行枚举的任何其他条件。
2. 可以自定义默认超时值和频率,并且仅将其应用于特定元素,这与隐式等待不同,隐式等待在启动后就适用于 WebDriver 对象实例的寿命。
3. 我们可以实现自己的条件,也可以使用 ExpectedConditions 类中的预定义条件之一。
4. 使用 FluentWait,我们可以忽略某些异常并改为指定自定义错误消息。 这将我们的调试经验提升到一个全新的水平。
1. 与隐式等待不同,此方法适用于`findElement(s)`以及您可能会想到的在自动化网页时进行枚举的任何其他条件。
2. 可以自定义默认超时值和频率,并且仅将其应用于特定元素,这与隐式等待不同,隐式等待在启动后就适用于`WebDriver`对象实例的寿命。
3. 我们可以实现自己的条件,也可以使用`ExpectedConditions`类中的预定义条件之一。
4. 使用`FluentWait`,我们可以忽略某些异常并改为指定自定义错误消息。 这将我们的调试经验提升到一个全新的水平。
5. 通过忽略特定的异常直到满足我们的条件,流利的等待比隐式等待更可靠。
同意的显式等待包括对代码的更多修饰,但是您认为值得这样做吗?
**注意***您可能会想,为什么要经历所有这些痛苦? 我不能只使用 Thread.sleep()吗? 嗯,不 不建议这样做,因为它会使整个测试脚本无条件进入休眠状态。 在大多数情况下,指定的睡眠时间不够长(导致异常),或者变得太长,导致即使元素加载速度更快,测试也要等待。*
**注意***您可能会想,为什么要经历所有这些痛苦? 我不能只使用`Thread.sleep()`吗? 嗯,不 不建议这样做,因为它会使整个测试脚本无条件进入休眠状态。 在大多数情况下,指定的睡眠时间不够长(导致异常),或者变得太长,导致即使元素加载速度更快,测试也要等待。*
**令我全神贯注**:虽然显式等待涉及更多的编程部分,但由于它能够解决很多问题,使我们的生活变得更加轻松,我宁愿选择此方法,而不是隐式等待(基于 测试自动化的需求和复杂性涉及*眨眼*)。
......
# 9j。 WebDriver – 定位元素:第 1 部分(按 id,名称,tagName
# 9j。 WebDriver – 定位元素:第 1 部分(按 Id,名称,标签名称
> 原文: [https://javabeginnerstutorial.com/selenium/9j-webdriver-locating-elements-1/](https://javabeginnerstutorial.com/selenium/9j-webdriver-locating-elements-1/)
朋友! 如果您进入了 Selenium 世界,那么您一定已经遇到了 Web Elements! 文本框,按钮,链接,复选框,单选按钮,下拉菜单,警报等,所有内容均视为网络元素。 使用定位器类型和策略,我们可以轻松识别页面上任何所需的元素。 这是与页面进行交互并在代码中进一步引用这些元素的最关键步骤。 是的,它与我们在 Selenium IDE 中看到的[非常相似](https://javabeginnerstutorial.com/selenium/7k-ide-locating-elements/),除了语法和概念的应用方式。
朋友! 如果您进入了 Selenium 世界,那么您一定已经遇到了 Web 元素! 文本框,按钮,链接,复选框,单选按钮,下拉菜单,警报等,所有内容均视为网络元素。 使用定位器类型和策略,我们可以轻松识别页面上任何所需的元素。 这是与页面进行交互并在代码中进一步引用这些元素的最关键步骤。 是的,它与我们在 Selenium IDE 中看到的[非常相似](https://javabeginnerstutorial.com/selenium/7k-ide-locating-elements/),除了语法和概念的应用方式。
使用 Selenium webDriver 定位 Web 元素的一般语法是:
......@@ -16,8 +16,8 @@ driver.findElement(By.LocatorStrategyType ("Locator_Value"));
* `findElement()` – 查找并返回具有指定位置策略的第一个 Web 元素
* `findElements()` – 查找并返回与给定位置策略匹配的 Web 元素列表
* `By` – 始终使用按类别定位目标
* `LocatorStrategyType` – ID,名称,标记名,类名,cssSelector,linkText,partialLinkText,xpath 是可用于在页面上定位元素的某些定位器类型
* `Locator_Value` – 可以标识元素的 value / HTML 标记
* `LocatorStrategyType` – ID,名称,标记名,类名,`cssSelector``linkText``partialLinkText`,xpath 是可用于在页面上定位元素的某些定位器类型
* `Locator_Value` – 可以标识元素的/ HTML 标记
#### 可用的定位器类型包括:
......@@ -36,15 +36,15 @@ driver.findElement(By.LocatorStrategyType ("Locator_Value"));
## 通过 ID 定位
id 是在页面上定位元素的最有用和首选的方式,因为它是唯一的。 但是,当心! 一些开发人员或者自动生成这些 ID,或者完全忘记添加一个。 那就是我们去寻找其他定位器类型的时候。
ID 是在页面上定位元素的最有用和首选的方式,因为它是唯一的。 但是,当心! 一些开发人员或者自动生成这些 ID,或者完全忘记添加一个。 那就是我们去寻找其他定位器类型的时候。
**语法**`driver.findElement(By.id("element_id"));`
**说明**:找到具有匹配 id 属性的第一个元素。
**说明**:找到具有匹配 ID 属性的第一个元素。
**示例**:打开 Goog​​le 帐户创建页面。 让我们通过 ID 识别名字文本框。
* Google Chrome – 右键单击要确定其 ID 的网络元素,然后选择“检查”。 或通过单击 F12 打开开发人员工具,单击左上角的检查元素图标,然后在页面上单击所需的 Web 元素。 两种方法都将突出显示与所选元素相对应的 HTML 代码。
* Google Chrome – 右键单击要确定其 ID 的网络元素,然后选择“检查”。 或通过单击`F12`打开开发人员工具,单击左上角的检查元素图标,然后在页面上单击所需的 Web 元素。 两种方法都将突出显示与所选元素相对应的 HTML 代码。
* Mozilla Firefox – 右键单击 Web 元素,然后选择“使用 Firebug 检查元素”(以防您错过了 [Firebug 安装和使用](https://javabeginnerstutorial.com/selenium/7n-ide-using-firebug/) 上的帖子)。 或者,如果您确实不想使用 Firebug,则右键单击该元素并选择“检查元素”。 在两种情况下,都将打开并突出显示相应的 HTML 代码。
![Locating by Id](img/c073039501d98689d51ef3a4addb1095.png)
......@@ -57,7 +57,7 @@ driver.findElement(By.id("FirstName"));
## 按名称定位
Name 属性也可用于在页面上定位元素。
`name`属性也可用于在页面上定位元素。
**语法**`driver.findElement(By.name("element_name"));`
......@@ -65,7 +65,7 @@ Name 属性也可用于在页面上定位元素。
**示例**:让我们按名称标识姓氏文本框。
右键单击姓氏文本框,然后单击检查元素以获取相应的 HTML 代码。 在我们的案例中,name 属性的值为 LastName。 因此,按名称定位此网络元素的代码将是,
右键单击姓氏文本框,然后单击检查元素以获取相应的 HTML 代码。 在我们的案例中,`name`属性的值为`LastName`。 因此,按名称定位此网络元素的代码将是,
```java
driver.findElement(By.name("LastName"));
......@@ -75,7 +75,7 @@ driver.findElement(By.name("LastName"));
## 通过标记名 定位
在这里,我们使用标记的实际名称,例如<>作为锚,<表>作为表。 当我们想要获得具有给定标签名称的所有元素时,这很有用。 如果被测页面只有一个标签,则 findElement 将起作用。 但否则,建议对结果建立索引以找到我们希望使用的特定元素。
在这里,我们使用标记的实际名称,例如`<a>`作为锚,`<form>`作为表。 当我们想要获得具有给定标签名称的所有元素时,这很有用。 如果被测页面只有一个标签,则`findElement`将起作用。 但否则,建议对结果建立索引以找到我们希望使用的特定元素。
**语法**`driver.findElements(By.tagName("element_html_tag"));`
......@@ -83,7 +83,7 @@ driver.findElement(By.name("LastName"));
**示例**:让我们找到 Gmail 帐户创建页面右上角的“登录”按钮。
右键单击按钮,然后单击检查元素以获取相应的 HTML 代码。 我们可以看到它具有锚标记。 让我们继续并在列表中获取所有具有 tagName“a”的网络元素,然后通过其索引找到第一个元素,以便与“登录”按钮进行交互。
右键单击按钮,然后单击检查元素以获取相应的 HTML 代码。 我们可以看到它具有锚标记。 让我们继续并在列表中获取所有具有`tagName="a"`的网络元素,然后通过其索引找到第一个元素,以便与“登录”按钮进行交互。
```java
// List of all elements with anchor tag
......@@ -101,10 +101,10 @@ WebElement signInButton = buttons.get(0);
1. 打开 Firefox 浏览器。
2. 导航到 Google 帐户创建页面
3. 通过 ID 找到名字文本框
4. 输入“fname01”作为名字
4. 输入“`fname01`”作为名字
5. 按名称找到姓氏文本框
6. 输入“lname01”作为姓氏
7. 使用 tagName 找到“登录”按钮
6. 输入“`lname01`”作为姓氏
7. 使用`tagName`找到“登录”按钮
8. 将按钮文字打印到控制台进行验证
此方案的 JUnit 代码是,
......@@ -179,13 +179,13 @@ System.out.println("First button text: " + signInButton.getText());
**导入**`org.openqa.selenium.WebElement` – 实例化一个新的 Web 元素。
**导入**`org.openqa.selenium.By` – 该包引用了被称为定位器类型的 By 类。
**导入**`org.openqa.selenium.By` – 该包引用了被称为定位器类型的`By`类。
注释清楚地提供给每一行代码,因此很容易解释。
![Output1](img/125542272ed942fe903e270ac7bb44bb.png)
执行测试用例后,成功显示为绿色,并且输出显示在控制台上,确认“登录”按钮与 tagName 一起位于。 图像的右半部分显示了在 Firefox 浏览器中执行的自动输出。 名字和姓氏文本框将填充代码中给出的值。
执行测试用例后,成功显示为绿色,并且输出显示在控制台上,确认“登录”按钮与`tagName`一起位于。 图像的右半部分显示了在 Firefox 浏览器中执行的自动输出。 名字和姓氏文本框将填充代码中给出的值。
让我们在这里休息一下。 在下面的文章中,我们将通过示例看到另外三种查找元素的方法。 蒙克就这些想法直到那时!
......
# 9k。 WebDriver – 定位元素:第 2 部分(按 className,linkText,partialLinkText
# 9k。 WebDriver – 定位元素:第 2 部分(按`className`,`linkText`,`partialLinkText`
> 原文: [https://javabeginnerstutorial.com/selenium/9k-webdriver-locating-elements-2/](https://javabeginnerstutorial.com/selenium/9k-webdriver-locating-elements-2/)
朋友! 让我们今天更深入地研究一下定位元素的更多策略。 在这篇文章中,我们将重点放在
* 班级名称
* LinkText
* partialLinkText
* `className`
* `LinkText`
* `partialLinkText`
### 按类别名称定位
类名称不过是用于设置 Web 元素样式的 CSS 类名称。 重要的是要注意页面上的许多 Web 元素可能具有相同的 className。 在这种情况下,可以使用 findElements 方法,并且可以为结果建立索引。 请参考通过 tagName 策略定位(解释以及[先前文章](https://javabeginnerstutorial.com/selenium/9j-webdriver-locating-elements-1/)中提供的示例)。 如果我们有一个具有唯一 className 的元素,或者被测元素是该页面中使用该 className 的第一个元素,则 findElement 将执行此任务。
类名称不过是用于设置 Web 元素样式的 CSS 类名称。 重要的是要注意页面上的许多 Web 元素可能具有相同的`className`。 在这种情况下,可以使用`findElements`方法,并且可以为结果建立索引。 请参考通过`tagName`策略定位(解释以及[先前文章](https://javabeginnerstutorial.com/selenium/9j-webdriver-locating-elements-1/)中提供的示例)。 如果我们有一个具有唯一`className`的元素,或者被测元素是该页面中使用该`className`的第一个元素,则`findElement`将执行此任务。
**语法**`driver.findElement(By.className("element_class_name"))`*
......@@ -18,7 +18,7 @@
**示例**:让我们找到 gmail 帐户创建页面的“手机”文本框。
右键单击文本框,然后选择检查元素以获取相应的 HTML 代码。 我们可以看到“input”标签包含 *class =“i18n_phone_number_input-inner_input”* 。 让我们继续使用此类名称查找“手机”文本框,以进行进一步的交互。
右键单击文本框,然后选择检查元素以获取相应的 HTML 代码。 我们可以看到“`input`”标签包含`class ="i18n_phone_number_input-inner_input"`。 让我们继续使用此类名称查找“手机”文本框,以进行进一步的交互。
*代码:*
......@@ -28,9 +28,9 @@ driver.findElement(By.className("i18n_phone_number_input-inner_input"));
![Locating by ClassName](img/35fbb3061abb7c05aa82266e0c5f1ebf.png)
### 通过 linkText 定位
### 通过`linkText`定位
当您想与超链接进行交互时,linkText 非常有用。 使用该链接在网页上显示的实际文本。 那有多容易?
当您想与超链接进行交互时,`linkText`非常有用。 使用该链接在网页上显示的实际文本。 那有多容易?
**语法**`driver.findElement(By.linkText("hyperlink_text");`
......@@ -46,9 +46,9 @@ driver.findElement(By.linkText("Learn more"));
![Locating by LinkText](img/1a2edf43e534f498a4f3275dd5f6e4f3.png)
### 通过 partialLinkText 定位
### 通过`partialLinkText`定位
PartialLinkText 也用于与超链接进行交互,与 linkText 定位策略非常相似。 此方法不提供部分完整链接,而是提供链接显示的完整文本。 因此,可以将链接文本的一部分作为匹配条件。
`PartialLinkText`也用于与超链接进行交互,与`linkText`定位策略非常相似。 此方法不提供部分完整链接,而是提供链接显示的完整文本。 因此,可以将链接文本的一部分作为匹配条件。
**语法**`driver.findElement(By.partialLinkText("hyperlink_partial_text");`
......@@ -72,11 +72,11 @@ driver.findElement(By.partialLinkText("I prefer to"));
1. 打开 Firefox 浏览器。
2. 导航到 Google 帐户创建页面
3. 通过 className 找到手机文本框
4. 输入“9496543210”作为手机号码
5. 通过 linkText 找到“了解详情”超链接
3. 通过`className`找到手机文本框
4. 输入“`9496543210`”作为手机号码
5. 通过`linkText`找到“了解详情”超链接
6. 链接超链接
7. 找到“我更喜欢使用当前的电子邮件地址”超链接和 partialLinkText
7. 找到“我更喜欢使用当前的电子邮件地址”超链接和`partialLinkText`
8. 将完整的链接文本打印到控制台进行验证
此方案的 JUnit 代码是,
......
......@@ -2,13 +2,13 @@
> 原文: [https://javabeginnerstutorial.com/selenium/9l-webdriver-locating-elements-3a/](https://javabeginnerstutorial.com/selenium/9l-webdriver-locating-elements-3a/)
嗨呀测试人员! 让我们直接进入 cssSelector 定位策略。
嗨呀测试人员! 让我们直接进入`cssSelector`定位策略。
如果我们没有选择使用 ID,类或名称来查找元素的方法,该怎么办? 袖子上有东西吗? 好吧,我有一个 `cssSelector`。 这是一种先进而有效的策略。
如果我们没有选择使用 ID,类或名称来查找元素的方法,该怎么办? 袖子上有东西吗? 好吧,我有一个`cssSelector`。 这是一种先进而有效的策略。
##### 准备点亮
* **CSS** (级联样式表)。 根据 Wikipedia 的说法,“CSS 是一种样式表语言,用于描述以标记语言编写的文档的表示形式”。 它通过添加样式来更改 HTML 元素的外观,并定义应如何在网页上显示它们。
* **CSS** (级联样式表)。 根据维基百科的说法,“CSS 是一种样式表语言,用于描述以标记语言编写的文档的表示形式”。 它通过添加样式来更改 HTML 元素的外观,并定义应如何在网页上显示它们。
* **选择器**是使用 HTML 标记,属性及其值构造的模式。 然后将它们用于匹配所需的 Web 元素。
##### 使用`cssSelector`定位器优于 XPath 定位器的优点
......@@ -18,9 +18,9 @@
* 更具可读性
* 首选使用方式
## 通过 cssSelector 定位
## 通过`cssSelector`定位
有多种使用 cssSelector 定位器的方式,这取决于可用的标签,属性,关键字等。要列出它们,
有多种使用`cssSelector`定位器的方式,这取决于可用的标签,属性,关键字等。要列出它们,
1. 使用标签和 ID 属性
2. 使用标签和类属性
......@@ -33,7 +33,7 @@
## 1.使用标签和 ID 属性
借助 cssSelector 定位策略,可以使用元素的 HTML 标记及其 ID 属性及其值来对其进行访问。
借助`cssSelector`定位策略,可以使用元素的 HTML 标记及其 ID 属性及其值来对其进行访问。
有两种方法可以实现此目的:
......@@ -47,7 +47,7 @@
**示例**:让我们在 Gmail 帐户登录页面上找到“电子邮件”文本框。
右键单击“输入电子邮件”文本框,然后选择检查元素以获取相应的 HTML 代码。 我们可以看到“输入”标签的“id”属性为“电子邮件”。
右键单击“输入电子邮件”文本框,然后选择检查元素以获取相应的 HTML 代码。 我们可以看到“`input`”标签的“`id`”属性为“`email`”。
*代码:*
......@@ -155,7 +155,7 @@ driver.findElement(By.cssSelector("input#Passwd[name='Passwd']"));
driver.findElement(By.cssSelector("input[type='Password'][name='Passwd'"));
```
如果使用 id,则可以用“# ”符号表示,而可以用“。”符号表示类。
如果使用 id,则可以用“`#`”符号表示,而可以用“`.`”符号表示类。
*感觉都糟透了吗? 需要一些时间练习吗?*
......
# 9m。 WebDriver – 定位元素:第 3b 部分(由 cssSelector 续)
# 9m。 WebDriver – 定位元素:第 3b 部分(`cssSelector`续)
> 原文: [https://javabeginnerstutorial.com/selenium/9m-webdriver-locating-elements-3b/](https://javabeginnerstutorial.com/selenium/9m-webdriver-locating-elements-3b/)
嗨,忍者! 这篇文章是我们先前文章“[*9l WebDriver – 定位元素:第 3a 部分(由`cssSelector`提供)*](https://javabeginnerstutorial.com/selenium/9l-webdriver-locating-elements-3a/)”的延续。 。 在继续进行操作之前,请确保对它进行了仔细的研究。
使用 cssSelector 定位器的最后两种方法尚待讨论:
使用`cssSelector`定位器的最后两种方法尚待讨论:
1. 定位子元素
2. 按子字符串匹配
......@@ -13,11 +13,11 @@
## 1.定位子元素
也可以使用 cssSelectors 来定位子元素。
也可以使用`cssSelectors`来定位子元素。
让我们考虑一下 HTML 代码,
锚标记是“div”的子元素。 要访问子元素,
锚标记是“`div`”的子元素。 要访问子元素,
*使用 ID:*
......@@ -25,7 +25,7 @@
driver.findElement(By.cssSelector("div#child a"));
```
`#`代表“id”,子元素标签写在空格后面。
`#`代表“ID”,子元素标签写在空格后面。
*使用类别:*
......@@ -55,7 +55,7 @@ driver.findElement(By.cssSelector("div.bg_main a"));
driver.findElement(By.cssSelector("label#recovery-email-label input[name='RecoveryEmailAddress']"));
```
如果父元素具有**多个子元素**(例如下拉列表),并且它们没有“id”或“class”或此类属性来标识,则“`nth-of-type`”用于定位特定的子元素。
如果父元素具有**多个子元素**(例如下拉列表),并且它们没有“`id`”或“`class`”或此类属性来标识,则“`nth-of-type`”用于定位特定的子元素。
考虑一下 HTML 代码,
......@@ -77,7 +77,7 @@ driver.findElement(By.cssSelector("ul#pets li:nth-of-type(2)"));
## 按子字符串匹配
cssSelectors 也帮助我们使用子字符串来定位元素。
`cssSelectors`也帮助我们使用子字符串来定位元素。
### 匹配前缀(或)以开头
......@@ -93,7 +93,7 @@ cssSelectors 也帮助我们使用子字符串来定位元素。
<input value="" name="LastName" id="LastName" spellcheck="false" type="text">
```
我们可以看到“输入”标签具有一个名为“姓氏”的“id”属性。 要找到此元素,我们可以指定查找以“Last”开头的“id”属性值。
我们可以看到“输入”标签具有一个名为“`LastName`”的“`id`”属性。 要找到此元素,我们可以指定查找以“`Last`”开头的“`id`”属性值。
*Code:*
......@@ -115,7 +115,7 @@ Considering the below code,
<input name="PasswdAgain" id="PasswdAgain" type="password">
```
我们可以看到“输入”标签的“名称”属性为“PasswdAgain”。 要找到此元素,我们可以指定查找以“Again”结尾的“name”属性值。
我们可以看到“`input`”标签的“`name`”属性为“`PasswdAgain`”。 要找到此元素,我们可以指定查找以“`Again`”结尾的“`name`”属性值。
*Code:*
......@@ -137,7 +137,7 @@ Considering the below code,
<input name="PasswdAgain" id="PasswdAgain" type="password">
```
我们可以看到“输入”标签的“名称”属性为“PasswdAgain”。 要找到此元素,我们可以指定查找包含“wdAg”的“名称”属性值。
我们可以看到“`input`”标签的“`name`”属性为“`PasswdAgain`”。 要找到此元素,我们可以指定查找包含“`wdAg`”的“`name`”属性值。
*Code:*
......@@ -147,24 +147,24 @@ driver.findElement(By.cssSelector("input[name*='wdAg']"));
## 总体图片
让我们看一个测试用例,它实现了使用本方法和上一篇文章中介绍的 cssSelector 定位器的不同方法,
让我们看一个测试用例,它实现了使用本方法和上一篇文章中介绍的`cssSelector`定位器的不同方法,
**场景**
1. 打开 Firefox 浏览器。
2. 导航到 Google 帐户创建页面
3. 找到带有 HTML 标签和名称属性的“名字”文本框
4. 输入“testFirst”作为名字
4. 输入“`testFirst`”作为名字
5. 在“姓氏”文本框中找到一个以子字符串开头的值
6. 输入“testLast”作为姓氏
6. 输入“`testLast`”作为姓氏
7. 找到带有 HTML 标签,类型和名称属性的“创建密码”文本框
8. 输入“Pass1234!”作为密码
8. 输入“`Pass1234!`”作为密码
9. 在“确认您的密码”文本框中找到包含子字符串的值
10. 输入“Pass1234!”作为确认密码
10. 输入“`Pass1234!`”作为确认密码
11. 找到带有 HTML 标签和类别属性的“手机”文本框
12. 输入“9496543210”作为电话号码
12. 输入“`9496543210`”作为电话号码
13. 使用子元素方法找到“当前电子邮件地址”文本框
14. 输入“[[受电子邮件保护]](/cdn-cgi/l/email-protection)
14. 输入“`...`
15. 验证“JUnit”窗格是否成功,并确认 Eclipse IDE 控制台输出屏幕
此方案的 JUnit 代码是,
......
......@@ -2,7 +2,7 @@
> 原文: [https://javabeginnerstutorial.com/selenium/9n-webdriver-locating-elements-4a/](https://javabeginnerstutorial.com/selenium/9n-webdriver-locating-elements-4a/)
欢迎回来,我们今天将讨论 XPath 策略。 这也是一种先进且有效的定位策略(cssSelectors 也是!)。 虽然有效,但有时可能会造成混淆。 因此,让我们深入研究如何理解我们经常被误解的朋友,并一劳永逸地提出好的代码。
欢迎回来,我们今天将讨论 XPath 策略。 这也是一种先进且有效的定位策略(`cssSelectors`也是!)。 虽然有效,但有时可能会造成混淆。 因此,让我们深入研究如何理解我们经常被误解的朋友,并一劳永逸地提出好的代码。
当所有希望都丧失了时,拯救自己的唯一机会就是转向 XPath 策略。 因为在大多数情况下,我们将测试现有的东西并且无法修改。 我们并不总是能够控制页面以添加一些 ID,从而使自动化成为一项更简单的任务。 因此,请停止咆哮并认真对待!
......@@ -26,7 +26,7 @@
2. 绝对 XPath 和相对 XPath
3. 使用标签和属性
4. 使用两个条件
5. 使用 contains()
5. 使用`contains()`
6. 查找多个元素
让我们从最简单的动机开始。
......@@ -37,7 +37,7 @@
食谱来了:
1. 点击 Firebug 图标或按“F12”。
1. 点击 Firebug 图标或按“`F12`”。
2. 检查其 XPath 是必需的元素。
3. 相应的代码将在 Firebug 面板的“HTML”部分中突出显示。
4. 右键点击突出显示的代码,然后选择“复制 XPath”
......@@ -54,21 +54,21 @@
为了从头提出 XPath,我们首先需要了解可用的两种 Xpath。 它们是绝对 XPath 和相对 XPath。
| **绝对 XPath** | **相对 XPath** |
| 它以单个正斜杠(/)开头。 | 它以双正斜杠(//)开头。 |
| ‘/”指示 XPath 引擎参考根节点搜索元素。 | “//”指示 XPath 引擎在 DOM 结构中的任何位置搜索匹配的元素。 |
| 它以单个正斜杠(`/`)开头。 | 它以双正斜杠(`//`)开头。 |
| `/`指示 XPath 引擎参考根节点搜索元素。 | `//`指示 XPath 引擎在 DOM 结构中的任何位置搜索匹配的元素。 |
| 与相对的 XPath 相比,元素标识更快。 | 由于仅指定了部分路径,因此需要花费更多时间来标识元素。 |
| 即使对 HTML DOM 结构进行了最细微的更改(例如添加标签或删除标签),绝对 XPath 也会失败。 | 相对 XPath 较短,更改的可能性较小,从而使其更可靠。 |
| 例如,/ html / head / body / div [2] / form / input | 例如//输入[@ name =“用户名”] |
| 例如,`/html/head/body/div[2]/form/input` | 例如`//input[@name="username"]` |
有了这些基本知识,就让我们开始吧!
### 3.使用标签和属性:
可以使用其 HTML 标签,其属性(例如 ID,名称,类,标题,值,href,src 等)及其相应的值来定位特定的 Web 元素。
可以使用其 HTML 标签,其属性(例如 ID,名称,类,标题,值,`href``src`等)及其相应的值来定位特定的 Web 元素。
**语法** *driver.findElement(By.xpath(“// tag_name [@ attribute ='value']”)));*
**语法**`driver.findElement(By.xpath("//tag_name[@attribute='value']"));`
**解释**:标识 XPath 指向的元素。 “//”标识指定的节点,“@”符号用于选择与给定值匹配的指定属性。
**解释**:标识 XPath 指向的元素。 “`//`”标识指定的节点,“`@`”符号用于选择与给定值匹配的指定属性。
**示例**:让我们在 Gmail 帐户注册页面上找到名字文本框。
......@@ -79,7 +79,7 @@
class="form-error" aria-invalid="true" type="text">
```
我们可以看到“input”标签具有一个“name”属性,其值为“FirstName”。
我们可以看到“`input`”标签具有一个“`name`”属性,其值为“`FirstName`”。
*代码:*(可以使用以下任一选项)
......@@ -95,7 +95,7 @@ driver.findElement(By.xpath("//input[@class='form-error']"));
driver.findElement(By.xpath("/html/body/div[1]/div[2]/div/div[1]/div/form/div[1]/fieldset/label[1]/input"));
```
表单标签有许多子 div 标签。 在我们的情况下,我们希望选择第一个 div 标签。 可以将其指定为“**div [1]** ”。 这些方括号[]中的数字表示要选择的确切同级。
表单标签有许多子`div`标签。 在我们的情况下,我们希望选择第一个`div`标签。 可以将其指定为“`div[1]`”。 这些方括号`[]`中的数字表示要选择的确切同级。
### 4.使用两个条件
......@@ -103,7 +103,7 @@ driver.findElement(By.xpath("/html/body/div[1]/div[2]/div/div[1]/div/form/div[1]
**语法**`driver.findElement(By.xpath("//tag_name[@attribute1='value1'][@attribute2='value2']"))`
**说明**:标识具有指定 tag_name 的元素,这些元素的属性与给定值匹配。
**说明**:标识具有指定`tag_name`的元素,这些元素的属性与给定值匹配。
**示例**:让我们在 Gmail 帐户注册页面上找到“确认密码”文本框。
......@@ -114,7 +114,7 @@ driver.findElement(By.xpath("/html/body/div[1]/div[2]/div/div[1]/div/form/div[1]
<input name="PasswdAgain" id="PasswdAgain" type="password">
```
请注意,两个文本框的“类型”属性值均相同,但“id”和“名称”的值均不同。 因此,为了找到“确认密码”文本框,让我们同时提及其“类型”和“id”值。
请注意,两个文本框的“`class`”属性值均相同,但“`id`”和“`name`”的值均不同。 因此,为了找到“确认密码”文本框,让我们同时提及其“`class`”和“`id`”值。
*代码:*
......@@ -122,15 +122,15 @@ driver.findElement(By.xpath("/html/body/div[1]/div[2]/div/div[1]/div/form/div[1]
driver.findElement(By.xpath("//input[@type='password'][@id='PasswdAgain']"));
```
### 5.使用 contains()
### 5.使用`contains()`
如今,大多数属性值(例如“id”,“src”,“href”等)都是使用恒定的前缀或后缀动态生成的。
如今,大多数属性值(例如“`id`”,“`src`”,“`href`”等)都是使用恒定的前缀或后缀动态生成的。
想象一个网页每天都有变化的图像。 其 src 可以是“Image_random-generated-key_date.jpg”。 在这种情况下,我们可以通过 XPath 使用在其 src 属性中包含“Image”值的“img”标记定位图像。 因此,通过指定属性的部分值,我们可以找到元素。
想象一个网页每天都有变化的图像。 其`src`可以是“`Image_random-generated-key_date.jpg`”。 在这种情况下,我们可以通过 XPath 使用在其`src`属性中包含“`Image`”值的“`img`”标记定位图像。 因此,通过指定属性的部分值,我们可以找到元素。
**语法**`driver.findElement(By.xpath("//tag_name[contains(@attribute, 'value')]]"))`
**说明**:标识具有指定 tag_name 的元素,该元素的属性与给定的部分值相匹配。
**说明**:标识具有指定`tag_name`的元素,该元素的属性与给定的部分值相匹配。
**示例**:让我们在 Gmail 帐户注册页面上找到“下一步”按钮。
......@@ -142,13 +142,13 @@ driver.findElement(By.xpath("//input[@type='password'][@id='PasswdAgain']"));
driver.findElement(By.xpath("//div[contains(@class,'button')]/input"));
```
注意,该 XPath 标识 div 元素,该 div 元素包含带有部分值'button'的 class 属性(`<div class="form-element nextstep-button">`),然后找到其子“`input`”标签(即“提交”按钮)。
注意,该 XPath 标识`div`元素,该`div`元素包含带有部分值`button``class`属性(`<div class="form-element nextstep-button">`),然后找到其子“`input`”标签(即“提交”按钮)。
### 6.查找多个元素
您可能会遇到希望查找具有特定类或名称的所有元素并对它们执行某些操作的情况。 星号(*)符号可助我们一臂之力!
您可能会遇到希望查找具有特定类或名称的所有元素并对它们执行某些操作的情况。 星号(`*`)符号可助我们一臂之力!
**示例**:让我们在 Gmail 帐户注册页面上找到所有类值为“goog-inline-block”的元素。
**示例**:让我们在 Gmail 帐户注册页面上找到所有类值为“`goog-inline-block`”的元素。
*Code:*
......@@ -156,9 +156,9 @@ driver.findElement(By.xpath("//div[contains(@class,'button')]/input"));
driver.findElements(By.xpath("//*[contains(@class,'goog-inline-block')]"));
```
这将找到在其“类别”属性中包含值“goog-inline-block”的所有标签。
这将找到在其“`class`”属性中包含值“`goog-inline-block`”的所有标签。
明确指出要使用“`findElements`”,以便将所有已标识的 Web 元素添加到列表中。 如果使用“findElement”,它将仅返回所标识的第一个元素。
明确指出要使用“`findElements`”,以便将所有已标识的 Web 元素添加到列表中。 如果使用“`findElement`”,它将仅返回所标识的第一个元素。
**总体图片**
......@@ -169,16 +169,16 @@ driver.findElements(By.xpath("//*[contains(@class,'goog-inline-block')]"));
1. 打开 Firefox 浏览器。
2. 导航到 Google 帐户创建页面
3. 使用绝对 XPath 找到“名字”文本框
4. 输入“testFirst”作为名字
5. 使用标签和“id”属性找到“姓氏”文本框(当然是相对的 XPath!)
6. 输入“testLast”作为姓氏
4. 输入“`testFirst`”作为名字
5. 使用标签和“`id`”属性找到“姓氏”文本框(当然是相对的 XPath!)
6. 输入“`testLast`”作为姓氏
7. 使用两个条件(类型和 ID 属性)找到“确认密码”文本框
8. 输入“Pass1234!”作为确认密码
9. 使用星号将所有包含在其“类别”属性中值“goog-inline-block”的元素定位
8. 输入“`Pass1234!`”作为确认密码
9. 使用星号将所有包含在其“`类别`”属性中值“`goog-inline-block`”的元素定位
10. 将找到的元素总数打印到控制台
11. 将第一个标识的元素的标题值打印到控制台
12. 使用 contains()找到“下一步”按钮
13. 将其“名称”属性的值打印到控制台
12. 使用`contains()`找到“下一步”按钮
13. 将其“`name`”属性的值打印到控制台
14. 验证 Eclipse IDE 控制台的输出屏幕和 JUnit 窗格是否成功
此方案的 JUnit 代码是,
......
# 9o。 WebDriver – 定位元素:第 4b 部分(XPath 续)
# 9o。 WebDriver – 定位元素:第 4b 部分(XPath 续)
> 原文: [https://javabeginnerstutorial.com/selenium/9o-webdriver-locating-elements-4b/](https://javabeginnerstutorial.com/selenium/9o-webdriver-locating-elements-4b/)
......@@ -8,19 +8,19 @@
在这篇文章中,我们将研究以下技术,
1. 使用 Text()
2. 使用 starts-with()
1. 使用`Text()`
2. 使用`starts-with()`
3. 使用 XPath 轴
这些技术以及我们在第 4a 部分中看到的技术可以结合起来,并用于形成有效的 XPath,该 XPath 可以定位网页上的任何元素。 现在通过示例来介绍当今的技术。
## 1.使用 text()
## 1.使用`text()`
通过提供与网页上显示的文本**完全相同的**文本,这是一种轻松定位元素的方法。
**注意:**
*当心! 即使错误地包含空格,您也可能遇到“ElementNotFound”异常。 在代码中提供的文本必须与可见文本完全匹配,这一点非常重要,我的意思是从字面上看!*
*当心! 即使错误地包含空格,您也可能遇到“`ElementNotFound`”异常。 在代码中提供的文本必须与可见文本完全匹配,这一点非常重要,我的意思是从字面上看!*
**示例**:让我们找到“Facebook 注册”页面上的“忘记帐户?”链接。
......@@ -39,17 +39,17 @@ data-testid="forgot_account_link">Forgot account?</a>
driver.findElement(By.xpath("//a[text()='Forgot account?']"));
```
如果要查找包含部分文本的所有元素,可以将 contains()和 text()技术结合使用。 可以使用 findElements 方法在列表中获取所有元素。
如果要查找包含部分文本的所有元素,可以将`contains()``text()`技术结合使用。 可以使用`findElements`方法在列表中获取所有元素。
让我们尝试在同一示例中同时实现 contains()和 text()。 由于我们只有一个链接与该文本,因此将使用 findElement 方法。
让我们尝试在同一示例中同时实现`contains()``text()`。 由于我们只有一个链接与该文本,因此将使用`findElement`方法。
```java
driver.findElement(By.xpath("//*[contains(text(),'Forgot')]"));
```
## 2.使用 starts-with()
## 2.使用`starts-with()`
通过指定属性的部分值(前缀),可以使用 starts-with()查找元素。 当页面重新加载时属性值动态更改时,此功能非常有用。
通过指定属性的部分值(前缀),可以使用`starts-with()`查找元素。 当页面重新加载时属性值动态更改时,此功能非常有用。
**示例**:让我们在“Facebook 注册”页面上找到“新密码”文本框。
......@@ -120,7 +120,7 @@ XPath 轴定义在当前节点浏览 DOM 的树形结构时要考虑的相对于
driver.findElement(By.xpath("//i[@class='fb_logo']/parent::a"));
```
将找到具有 href 和 title 属性的父节点“a”。
将找到具有`href`和`title`属性的父节点“`a`”。
### 3b。 祖先轴
......@@ -138,7 +138,7 @@ Birthday
driver.findElement(By.xpath("//select[@id='month']/ancestor::div[@class='_5k_5']/preceding-sibling::div"));
```
带有 ID 的“选择”标签,选择了“月”。 转到类“_5k_5”的祖先 div 标签。 然后到其前一个带有“div”标签的同级节点,其文本为“Birthday”。
带有 ID 的“`select`”标签,选择了“`month`”。 转到类“`_5k_5`”的祖先`div`标签。 然后到其前一个带有“`div`”标签的同级节点,其文本为“`Birthday`”。
选择该特定示例以显示可以组合多个轴以获得所需的结果。
......@@ -160,7 +160,7 @@ Upon inspecting the element,
driver.findElement(By.xpath("//label[@id='loginbutton']/child::input"));
```
标识为“loginbutton”的标签的子节点-标识为“u_0_q”的输入标签。
标识为“`loginbutton`”的标签的子节点-标识为“`u_0_q`”的输入标签。
### 3d。 后裔轴
......@@ -172,7 +172,9 @@ Upon inspecting the element,
First name
<输入 id =“u_0_1”类=“inputtext _58mg _5dba _2ph-” data-type =“text” name =“firstname” aria-required =“1” placeholder =“”“aria-label =” First name“类型 =“文字” > < / div >
```java
<input id=”u_0_1″ class=”inputtext _58mg _5dba _2ph-” data-type=”text” name=”firstname” aria-required=”1″ placeholder=”” aria-label=”First name” type=”text”> </div>
```
*Code:*
......@@ -180,9 +182,9 @@ First name
driver.findElement(By.xpath("//div[contains(@class,'uiStickyPlaceholderInput')]/descendant::input"));
```
类别为'uiStickyPlaceholderInput'的'div'标签的后代节点-ID 为'u_o_1'的输入标签已找到。
类别为`uiStickyPlaceholderInput`的`div`标签的后代节点-ID 为`u_o_1`的输入标签已找到。
### 3e。 从动
### 3e。 同级
选择当前节点之后的所有同级
......@@ -205,7 +207,7 @@ Upon inspecting the element,
driver.findElement(By.xpath("//td[@class='_51m- hLeft plm']/following-sibling::td/child::a"));
```
以下 td 标签的同级类 _51m-hLeft plm 是另一个 td 标签,其子对象是带有标题“登录 Facebook”的锚标签。
以下`td`标签的同级类`_51m-hLeft plm`是另一个`td`标签,其子对象是带有标题“登录 Facebook”的锚标签。
将后继同级和子级轴组合在一起,以在页脚部分中找到“登录”超链接。
......@@ -240,7 +242,7 @@ driver.findElement(By.xpath("//label[@class='_58mt']/preceding-sibling::input"))
* *症状*:没有任何东西被注册,开始浏览文章或忘记您刚刚阅读的内容。
* *诊断*:您的大脑超负荷。
* *Remedy*:Take a break! But remember to be back soon 😉
* *补救*:休息一下! 但是记得很快回来😉
*我将根据我的经验个人建议 **Pomodoro 技术**。 它非常有效。 试一试!*
......@@ -252,10 +254,10 @@ driver.findElement(By.xpath("//label[@class='_58mt']/preceding-sibling::input"))
1. 打开 Firefox 浏览器。
2. 导航到 www.facebook.com
3. 使用 text()找到“忘记帐户?”链接
3. 使用`text()`找到“忘记帐户?”链接
4. 将链接文本打印到控制台
5. 使用 starts-with()找到“新密码”文本框
6. 输入值“test1234!
5. 使用`starts-with()`找到“新密码”文本框
6. 输入值“`test1234!`
7. 使用子轴找到“登录”按钮
8. 将值属性打印到控制台
9. 使用父轴找到 Facebook 徽标
......
......@@ -4,7 +4,7 @@
今天*锦上添花*:“一种验证所选择的定位器策略是否唯一标识被测网络元素的捷径”。
想象一下,您有一个取决于许多因素的测试脚本。 当您要测试新的 Web 元素时,要求您对它进行一些补充。 为了定位每个元素,可以使用先前文章中讨论的任何定位器策略(按 ID,名称,tagName,className,linkText,cssSelector,xpath 等)。 要检查代码是否按预期工作并且 Web 元素是否正确定位,您将不得不一次又一次地运行整个测试用例。 真痛苦!
想象一下,您有一个取决于许多因素的测试脚本。 当您要测试新的 Web 元素时,要求您对它进行一些补充。 为了定位每个元素,可以使用先前文章中讨论的任何定位器策略(按 ID,名称,`tagName``className``linkText``cssSelector`,xpath 等)。 要检查代码是否按预期工作并且 Web 元素是否正确定位,您将不得不一次又一次地运行整个测试用例。 真痛苦!
在这种情况下,谁不喜欢快捷键或节省时间! 我听到你了
......@@ -12,7 +12,7 @@
#### 示例:
让我们使用 cssSelector(标记和名称属性)在 Gmail 帐户注册页面上找到“您当前的电子邮件地址”文本框。
让我们使用`cssSelector`(标记和名称属性)在 Gmail 帐户注册页面上找到“您当前的电子邮件地址”文本框。
右键点击“您当前的电子邮件地址”文本框,然后选择检查元素以获取相应的 HTML 代码,如下所示,
......@@ -22,7 +22,7 @@ value="" spellcheck="false" style="background-color: rgb(255, 255, 255);"
type="text">
```
我们可以看到“输入”标签的“名称”属性为“RecoveryEmailAddress”。 下图显示了验证我们的定位器所遵循的步骤。
我们可以看到“输入”标签的“名称”属性为“`RecoveryEmailAddress`”。 下图显示了验证我们的定位器所遵循的步骤。
![Shortcut](img/87d67dcea7c38175d9c6e55c5ca89c74.png)
......
......@@ -40,8 +40,8 @@
1. 打开 Firefox 浏览器
2. 导航至 https://www.in.ckgs.us/myaccount/
3. 通过 cssSelector 找到“当前护照号码”文本框:标记和名称属性
4. 输入“123456789
3. 通过`cssSelector`找到“当前护照号码”文本框:标记和名称属性
4. 输入“`123456789`
5. 提示用户进行干预并输入显示的验证码
6. 通过 ID 找到验证码文本框
7. 将用户输入的值发送到找到的验证码文本框中
......@@ -120,7 +120,7 @@ String captchaVal = JOptionPane.showInputDialog("Please enter the captcha value:
driver.findElement(By.id("recaptcha_response_field")).sendKeys(captchaVal);
```
保存在“captchaVal”中的该值将在 ID 所在的验证码文本框中输入。
保存在“`captchaVal`”中的该值将在 ID 所在的验证码文本框中输入。
![captcha_popup](img/a02b77a5d38b7b8d7bca02b434d431c4.png)
......
......@@ -33,7 +33,7 @@
## 示例场景
让我们获得为本教程系列创建的[示例网页](https://chandanachaitanya.github.io/selenium-practice-site/)的标题。 这将是我们使用 WebDriver `getTitle()`方法获得的**实际标题****预期标题**是“WebDriver 演示网站”。
让我们获得为本教程系列创建的[示例网页](https://chandanachaitanya.github.io/selenium-practice-site/)的标题。 这将是我们使用`WebDriver``getTitle()`方法获得的**实际标题****预期标题**是“WebDriver 演示网站”。
### 情况 1:通过`assertEquals`通过测试用例
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册