本文可能是目前最完整的一篇selenium(java版)实践文章,不是之一。
如果你是java开发人员,本文将帮助你快速搭建整套selenium自动化测试框架,你可以帮助公司升级为自动化测试架构;
如果你是测试人员,那你得按照本文多实践一下,遇到不懂的咨询下公司的java开发,同样你也可以完成自动化测试架构升级。
当然啦,如果目前公司已经是自动化测试了,那本文就当是再次梳理下相关知识吧。
предисловие
Когда дело доходит до автоматического тестирования селена, все думают об использовании языка python для написания скриптов. Но мы выбрали язык Java, потому что я считаю, что в большинстве компаний гораздо больше программистов на Java, чем на Python. Многие тестировщики не владеют языками программирования, поэтому им нужно руководство от других. Вместо того, чтобы использовать более простой язык python, но не понимать синтаксис и получать помощь от других, лучше использовать язык java, будь то синтаксис или идеи программирования, вы можете быстро получить помощь от разработчиков java.
задний план
У многих компаний уже может быть стандартный код внутреннего тестирования, но для автоматизированного тестирования необходимо протестировать всю систему, а внешний интерфейс отображается непосредственно пользователям.Поэтому внешний интерфейс особенно важен.Эта статья основана на h5. автоматизированное веб-интерфейсное тестирование. Конечно, рекомендуется разделить фронт и бэкенд проекта, если в проекте нет фронта и бекенда, то можно сослаться на него.Практика RESTful, общего интерфейса, разделения внешнего и внутреннего интерфейса и соглашения об интерфейсе в небольшой компании..
В настоящее время в Интернете очень мало полных статей о селене, и трудно купить книгу, посвященную селену, из-за чего многие тестировщики не могут начать, и эта статья восполнит эту проблему, познакомит с практикой селена. как можно подробнее и предоставьте полный код проекта упрощенной версии на github (поскольку код проекта компании не является десенсибилизированным, его нельзя напрямую разместить на github).
связанная информация
- HTML-тег
- css-стиль
- основы js
- основы Java
- основы bat-скрипта
Первый html состоит из тегов<x></x>
Состав, детали этой статьи будут представлены один за другим в реальном проекте.
официальная практика
Установить Firefox
Поскольку Selenium может автоматически записывать сценарии в браузере Firefox, мы можем создавать сценарии на разных языках посредством записи сценариев, что может сэкономить 90% нашей рабочей нагрузки на сценарии. Вы можете установить последнюю версию Firefox, а затем установить Katalon Recorder (Selenium IDE для Firefox). Откройте https://addons.mozilla.org/en-US/firefox/addon/katalon-automation-record/?src=search в Firefox.
сценарий записи
Возьмем, к примеру, Baidu для поиска золотых самородков.
- Адресная строка открывает Baidu
- В правом верхнем углу откройте расширение Katalon
- Нажмите на Katalon New
- Нажмите Запись
- Войдите на веб-страницу Nuggets.com
- Откройте первый официальный сайт Nuggets
- Найдите статью, которую я написал ранее, на официальном сайте Nuggets.Как реорганизовать весь проект НИОКР, чтобы способствовать внедрению DevOps для автоматизированной эксплуатации и обслуживания?
- Нажмите на первую статью. Как реорганизовать весь проект НИОКР, чтобы способствовать внедрению DevOps для автоматизированной эксплуатации и обслуживания?
- Нажмите на остановку Каталона
Каждый раз, когда вы выполняете операцию, в правом нижнем углу будет появляться подсказка.
Рендеринг после записиЗапуск и анализ скриптов
После записи нажимаем воспроизведение, и видим, что Firefox автоматически завершает только что проделанную нами операцию (закрытие блокировки всплывающих окон или добавление Nuggets и Baidu в список незаблокированных всплывающих окон)
Нажмите Экспорт
Вы можете видеть, что существуют различные языки C#, Java, каталон, python2 и т. д. Давайте сначала посмотрим на скрипт python2
# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
from selenium.common.exceptions import NoSuchElementException
from selenium.common.exceptions import NoAlertPresentException
import unittest, time, re
class Test(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Firefox()
self.driver.implicitly_wait(30)
self.base_url = "https://www.katalon.com/"
self.verificationErrors = []
self.accept_next_alert = True
def test_(self):
driver = self.driver
driver.get("https://www.baidu.com/index.php?tn=monline_3_dg")
driver.find_element_by_id("kw").click()
driver.find_element_by_id("kw").clear()
driver.find_element_by_id("kw").send_keys(u"掘金网")
driver.find_element_by_xpath("//div[@id='container']/div[2]/div").click()
driver.find_element_by_link_text(u"掘金- juejin.im - 一个帮助开发者成长的社区").click()
# ERROR: Caught exception [ERROR: Unsupported command [selectWindow | win_ser_1 | ]]
driver.find_element_by_xpath("//div[@id='juejin']/div[2]/div/header/div/nav/ul/li[2]/form/input").click()
driver.find_element_by_xpath("//div[@id='juejin']/div[2]/div/header/div/nav/ul/li[2]/form/input").click()
driver.find_element_by_xpath("//div[@id='juejin']/div[2]/div/header/div/nav/ul/li[2]/form/input").clear()
driver.find_element_by_xpath("//div[@id='juejin']/div[2]/div/header/div/nav/ul/li[2]/form/input").send_keys(u"我是如何重构整个研发项目,促进自动化运维DevOps的落地?")
driver.find_element_by_xpath("//div[@id='juejin']/div[2]/div/header/div/nav/ul/li[2]/form/input").send_keys(Keys.ENTER)
driver.find_element_by_link_text(u"我是如何重构整个研发项目,促进自动化运维DevOps的落地?").click()
def is_element_present(self, how, what):
try: self.driver.find_element(by=how, value=what)
except NoSuchElementException as e: return False
return True
def is_alert_present(self):
try: self.driver.switch_to_alert()
except NoAlertPresentException as e: return False
return True
def close_alert_and_get_its_text(self):
try:
alert = self.driver.switch_to_alert()
alert_text = alert.text
if self.accept_next_alert:
alert.accept()
else:
alert.dismiss()
return alert_text
finally: self.accept_next_alert = True
def tearDown(self):
self.driver.quit()
self.assertEqual([], self.verificationErrors)
if __name__ == "__main__":
unittest.main()
Давайте снова посмотрим на скрипт java junit.
package com.example.tests;
import java.util.regex.Pattern;
import java.util.concurrent.TimeUnit;
import org.junit.*;
import static org.junit.Assert.*;
import static org.hamcrest.CoreMatchers.*;
import org.openqa.selenium.*;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.Select;
public class Test {
private WebDriver driver;
private String baseUrl;
private boolean acceptNextAlert = true;
private StringBuffer verificationErrors = new StringBuffer();
@Before
public void setUp() throws Exception {
driver = new FirefoxDriver();
baseUrl = "https://www.katalon.com/";
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
}
@Test
public void test() throws Exception {
driver.get("https://www.baidu.com/index.php?tn=monline_3_dg");
driver.findElement(By.id("kw")).click();
driver.findElement(By.id("kw")).clear();
driver.findElement(By.id("kw")).sendKeys("掘金网");
driver.findElement(By.xpath("//div[@id='container']/div[2]/div")).click();
driver.findElement(By.linkText("掘金- juejin.im - 一个帮助开发者成长的社区")).click();
// ERROR: Caught exception [ERROR: Unsupported command [selectWindow | win_ser_1 | ]]
driver.findElement(By.xpath("//div[@id='juejin']/div[2]/div/header/div/nav/ul/li[2]/form/input")).click();
driver.findElement(By.xpath("//div[@id='juejin']/div[2]/div/header/div/nav/ul/li[2]/form/input")).click();
driver.findElement(By.xpath("//div[@id='juejin']/div[2]/div/header/div/nav/ul/li[2]/form/input")).clear();
driver.findElement(By.xpath("//div[@id='juejin']/div[2]/div/header/div/nav/ul/li[2]/form/input")).sendKeys("我是如何重构整个研发项目,促进自动化运维DevOps的落地?");
driver.findElement(By.xpath("//div[@id='juejin']/div[2]/div/header/div/nav/ul/li[2]/form/input")).sendKeys(Keys.ENTER);
driver.findElement(By.linkText("我是如何重构整个研发项目,促进自动化运维DevOps的落地?")).click();
}
@After
public void tearDown() throws Exception {
driver.quit();
String verificationErrorString = verificationErrors.toString();
if (!"".equals(verificationErrorString)) {
fail(verificationErrorString);
}
}
private boolean isElementPresent(By by) {
try {
driver.findElement(by);
return true;
} catch (NoSuchElementException e) {
return false;
}
}
private boolean isAlertPresent() {
try {
driver.switchTo().alert();
return true;
} catch (NoAlertPresentException e) {
return false;
}
}
private String closeAlertAndGetItsText() {
try {
Alert alert = driver.switchTo().alert();
String alertText = alert.getText();
if (acceptNextAlert) {
alert.accept();
} else {
alert.dismiss();
}
return alertText;
} finally {
acceptNextAlert = true;
}
}
}
Объем кода на python немного менее подробен, чем на java, но в этой статье рассказывается о практике языка java.
В основном мы фокусируемся на методе тестирования, аннотированном @Test в java-версии.
driver.get("https://www.baidu.com/index.php?tn=monline_3_dg");
driver.findElement(By.id("kw")).click();
driver.findElement(By.id("kw")).clear();
driver.findElement(By.id("kw")).sendKeys("掘金网");
driver.findElement(By.xpath("//div[@id='container']/div[2]/div")).click();
driver.findElement(By.linkText("掘金- juejin.im - 一个帮助开发者成长的社区")).click();
// ERROR: Caught exception [ERROR: Unsupported command [selectWindow | win_ser_1 | ]]
driver.findElement(By.xpath("//div[@id='juejin']/div[2]/div/header/div/nav/ul/li[2]/form/input")).click();
driver.findElement(By.xpath("//div[@id='juejin']/div[2]/div/header/div/nav/ul/li[2]/form/input")).click();
driver.findElement(By.xpath("//div[@id='juejin']/div[2]/div/header/div/nav/ul/li[2]/form/input")).clear();
driver.findElement(By.xpath("//div[@id='juejin']/div[2]/div/header/div/nav/ul/li[2]/form/input")).sendKeys("我是如何重构整个研发项目,促进自动化运维DevOps的落地?");
driver.findElement(By.xpath("//div[@id='juejin']/div[2]/div/header/div/nav/ul/li[2]/form/input")).sendKeys(Keys.ENTER);
driver.findElement(By.linkText("我是如何重构整个研发项目,促进自动化运维DevOps的落地?")).click();
Многие уже могут понять
driver.get("https://www.baidu.com/index.php?tn=monline_3_dg");
Открыть Байду
driver.findElement(By.id("kw")).click();
Перейдите к html-тегу по идентификатору, затем щелкните click(), очистите текстовое поле.clear(), введите 3 слова Nuggets sendKeys("Nuggets");
Здесь мы смотрим на код окна поиска Baidu.
<input type="text" class="s_ipt" name="wd" id="kw" maxlength="100" autocomplete="off">
driver.findElement(By.linkText("Самородки - juejin.im - сообщество, которое помогает разработчикам развиваться")).click();
Нажмите Самородки Перейдите к ярлыку по тексту ссылки и нажмите.
Позже найдите вход слой за слоем через div = juejin и, наконец, нажмите, чтобы войти в статью.
Распознавать html-теги
HTML <input>
Этикетка
<input>
Теги используются для сбора информации о пользователях.
Поля ввода имеют много форм, в зависимости от значения атрибута типа. Полями ввода могут быть текстовые поля, флажки, маскированные текстовые элементы управления, переключатели, кнопки и т. д.
<form action="form_action.asp" method="get">
First name: <input type="text" name="fname" />
Last name: <input type="text" name="lname" />
<input type="submit" value="Submit" />
</form>
Подробную информацию см. на http://www.w3school.com.cn/tags/tag_input.asp.
HTML <a>
Этикетка
<a> 标签定义超链接,用于从一张页面链接到另一张页面。
<a> 元素最重要的属性是 href 属性,它指示链接的目标。
Подробную информацию см. на http://www.w3school.com.cn/tags/tag_a.asp.
HTML <div>
Этикетка
<div>
Может определять подразделения или разделы (раздел/раздел) в документе.<div>
Теги могут разбить документ на отдельные отдельные части. Он может использоваться как строго организационный инструмент и не связан с ним никаким форматированием.
Если отмечен идентификатором или классом<div>
, то роль тега станет более эффективной.
<div style="color:#00FF00">
<h3>This is a header</h3>
<p>This is a paragraph.</p>
</div>
Для получения дополнительной информации см. http://www.w3school.com.cn/tags/tag_div.asp
…………
Другие теги не вводятся один за другим, но их можно найти на справочном веб-сайте.
знать css
Здесь упоминается только один ключевой момент, такой как
<div class="css1 css2"> ********</div>
Указывает, что этот div использует стили css1 и css2.Вам нужно только знать, что если вы не можете найти div на селене, вы можете использовать имя css, чтобы найти его.
Если вам интересно, вы можете ознакомиться с другими знаниями, связанными с CSS.
основы js
2 ключевых момента здесь
<a onclick="test()">test</a>
В приведенном выше коде щелчок по тегу запускает тестовый метод в js.Когда селен не может найти тег a, вы можете напрямую вызвать метод test().
Вы можете написать простые js-скрипты, всплывающий код:
alert("hello");
Скачать Google Chrome
Скачать Google Chrome версии 63.0.3239.84 можно здесь. На данный момент совместимость версий Google Chrome по-прежнему хорошая.
скачать селеновый драйвер
https://www.seleniumhq.org/download/
Нет, проект github в этой статье содержит
скачать веб-драйвер селена
https://npm.taobao.org/mirrors/chromedriver/ Необходимо загрузить версию 2.40, соответствующую Google Chrome. Нет, проект github в этой статье содержит
Скачать инструменты для разработки идей
https://www.jetbrains.com/idea/
Это сложнее, и выполнять его рекомендуется под руководством java-разработчиков.
selenium
Эта версия является облегченной версией, но достаточной
окончательный эффект
Записываем selenium-скрипт, редактируем его, отправляем в библиотеку git и автоматически компилируем jenkins jar-пакет, и выполняем его на любом ПК через команду bat (по умолчанию все модули автоматически выполняются после того, как разработчик отправит код ). По функциональному модулю, тестовому проекту, сгенерировать тестовый отчет. Модули, не прошедшие тест
максимизировать
driver.manage().window().maximize();
открыть страницу
driver.get("https://www.baidu.com");
позиционированный элемент
Когда несколько одинаковых, верните первый и выдайте NoSuchElementException, если он не найден.WebElement element = driver.findElement(*);
Когда возвращается несколько:
List<WebElement> elements = driver.findElements(*);
Как расположить элементы
<input class="input_class input_class2" type="text" name="user-name" id="user-id" />
найти по идентификатору
WebElement element = driver.findElement(By.id("user-id"));
найти по имени
WebElement element = driver.findElement(By.name("user-name"));
Найдите по className
WebElement element = driver.findElement(By.className("input_class.input_class2"));
Обратите внимание, что несколько классов разделены десятичными точками и также могут быть расположены с помощью cssSelector.
WebElement element = driver.findElement(By.cssSelector("input"));
Позиционирование по linkText, например:
WebElement element = driver.findElement(By.linkText("我是如何重构整个研发项目,促进自动化运维DevOps的落地?"));
Это означает позиционирование контента ссылки
Позиционирование по partialLinkText, нечеткое позиционирование контента, аналогично предыдущему
WebElement element = driver.findElement(By.linkText("我是如何重构整个研发项目?"));
Найдите по тегу
WebElement element = driver.findElement(By.tagName("form"));
найти по xpath
WebElement element = driver.findElement(By.xpath("//input[@id='passwd-id']"));
Самый сложный и простой вариант этого
//标签类型[@属性名=属性值]
Но вы также можете найти первый
//input[4]
Среди них вы также можете добавить логические и или выражения в []
WebElement element = driver.findElement(By.xpath("//input[@type='text' and @name='user-name']"));
WebElement element = driver.findElement(By.xpath("//input[@type='text' or @name='user-name']"));
[] также может добавлять начало, конец, содержание, например
WebElement element = driver.findElement(By.xpath("//input[start-with(@id,'user-')]"));
WebElement element = driver.findElement(By.xpath("//input[ends-with(@id,'user-')]"));
WebElement element = driver.findElement(By.xpath("//input[contains(@id,'user-')]"));
Также может иметь любое имя атрибута
WebElement element = driver.findElement(By.xpath("//input[@*='user-name']"));
Для получения дополнительной информации о том, как использовать xpath, см. http://www.w3school.com.cn/xpath/index.asp
нажмите на элемент
.click()
очистить ввод
.clear();
ввод содержимого
.sendKeys("掘金网");
Если вы загружаете вложение, вы можете напрямую отправить ключи пути
.sendKeys("c:\shao.png");
получить входное содержимое
.getText();
выпадающий список
Select select = new Select(driver.findElement(By.id("frequency")));
select.selectByValue("1");
driver.findElement(By.id("validDays")).click();
select.selectByValue("a");
select.deselectAll();
select.deselectByValue("a");
select.deselectByVisibleText("");
select.getAllSelectedOptions();
select.getFirstSelectedOption();
Одиночная коробка
WebElement radio=driver.findElement(By.id("radio"));
radio.click();     //选择某个选项
radio.clear();     //清空选项
radio.isSelected();  //判断某个单选项是否被选中
флажок
WebElement checkbox = driver.findElement(By.id("checkbox"));
checkbox.clear(); //清空选项
checkbox.isSelected(); //是否选中
Определить, кликабельно ли это
isEnabled()
работа с окном предупреждений
Alert alert = driver.switchTo().alert();
alert.accept();  //确定
alert.dismiss();  //取消
переключение iframe (фокус)
Может у многих старых проектов есть iframes.При записи скриптов они записываются нормально,а когда они исполняемые то не могут быть выполнены.В это время нужно переключать iframes
driver.switchTo().defaultContent(); //回到默认的页面
driver.switchTo().frame("leftFrame"); //切换到某个iframe
Переключите iframe, и когда все закончится, не забудьте вернуться на страницу по умолчанию.
driver.findElement(By.linkText("导入模板")).click();
WebElement iframe = driver.findElement(By.id("layui-layer-iframe1"));
driver.switchTo().frame(iframe);
Thread.sleep(2000);
driver.findElement(By.linkText("引用")).click();
driver.findElement(By.xpath("//button[@type='submit']")).click();
driver.findElement(By.xpath("(//button[@type='button'])[3]")).click();
Thread.sleep(1000);
driver.findElement(By.linkText("学生")).click();
Приведенное выше выдержка из кода проекта только для справки.
выполнить js
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("viewDetail('1f50555e409a4597a027ff415ce6c9b4','09','2018')");
Выполнить внутренний метод viewDetail
Задержка операции (важный)
Много раз нам нужно отложить, а затем использовать
Thread.sleep(1000);//延时1000毫秒
Многие ошибки связаны со временем ожидания, попробуйте добавить задержку и, возможно, проблема исчезнет.
код проекта
Предположим, наш продукт имеет несколько сред, мы определяем массив сред (когда -1, запрашивать ввод пользователя), есть несколько модулей (когда -1, запрашивать ввод пользователя), окончательный код выглядит следующим образом, после выполнения отчет об ошибке Он будет отправлен в указанный почтовый ящик или в другие места по почте.
Диаграмма эффекта бега
import org.openqa.selenium.*;
import org.openqa.selenium.chrome.ChromeDriver;
import webfunction.*;
import java.util.Scanner;
public class Main {
private static WebDriver driver;
private static String baseUrl;
private boolean acceptNextAlert = true;
/**
* 各个环境
* */
private static String[] environments = {"环境1", "环境2", "环境3", "环境4", "环境5", "环境6"};
/**
* 错误日志
* */
private static StringBuffer verificationErrors = new StringBuffer();
/**
* 是否处于debug模式
*/
private static boolean debug = false;
/**
* -1为手动模式,否则为指定数字
* */
private static String environment = "-1";
/**
* -1为手动模式,否则为指定数字
* */
private static String methods = "-1";
public static void main(String[] args) throws Exception {
//引用火狐浏览器驱动
System.setProperty("webdriver.chrome.driver", "C:\\selenium\\chromedriver.exe");
//定义用户名密码
String uname, upw;
Scanner sc = new Scanner(System.in);
System.out.println("请选择环境");
for (int i = 0; i < environments.length; i++) {
System.out.println(i + ":" + environments[i]);
}
if ("-1".equals(environment)) {
environment = sc.next();
}
System.out.println("请输入需要测试的功能,英文逗号隔开");
if ("-1".equals(methods)) {
methods = sc.next();
}
driver = new ChromeDriver();
System.out.println("您选择的是" + environments[Integer.valueOf(environment)]);
switch (environment) {
case "0":
baseUrl = "http://*.*.*.*/";
uname = "admin";
upw = "admin";
testManage(baseUrl, uname, upw, methods, driver);
break;
case "1":
baseUrl = "http://*.*.*.*/";
uname = "admin";
upw = "admin";
testManage(baseUrl, uname, upw, methods, driver);
break;
case "2":
//等等等……
break;
}
}
private static void testManage(String url, String uname, String upw, String methods, WebDriver driver) throws InterruptedException {
//先登录管理端
WebLogin.webLogin(driver, url, uname, upw);
//然后测试所有模块
String[] strArray = null;
strArray = methods.split(",");
for (int i = 0; i < strArray.length; i++) {
switch (strArray[i]) {
case "0":
try {
// 系统基础管理 - 用户管理 - 新增用户
WebSystemManage.addnewUser(driver, url);
} catch (Exception e) {
verificationErrors.append("系统基础管理 - 用户管理 - 新增用户 出错");
log(e);
}
break;
case "1":
try {
// 系统基础管理 - 用户管理 - 编辑用户
WebSystemManage.editUser(driver, url);
} catch (Exception e) {
System.out.println("系统基础管理 - 用户管理 - 编辑用户 出错");
log(e);
}
break;
default:
break;
}
}
report(verificationErrors);
}
private static void report(StringBuffer verificationErrors) {
//发送邮件
}
/**
* 根据debug变量是否输出日志
* @param e
*/
private static void log(Exception e) {
if (debug) {
e.printStackTrace();
}
}
private static boolean isElementPresent(By by) {
try {
driver.findElement(by);
return true;
} catch (NoSuchElementException e) {
return false;
}
}
private static boolean isAlertPresent() {
try {
driver.switchTo().alert();
return true;
} catch (NoAlertPresentException e) {
return false;
}
}
private static String closeAlertAndGetItsText() {
try {
Alert alert = driver.switchTo().alert();
String alertText = alert.getText();
if (acceptNextAlert) {
alert.accept();
} else {
alert.dismiss();
}
return alertText;
} finally {
acceptNextAlert = true;
}
}
}
Кодов очень много. На самом деле мы обращаем внимание только на содержимое в public static void main(String[] args) throws Exception {}. Например, если мы хотим запустить изначально записанный скрипт Nuggets, нам нужно только чтобы поставить код, на который я хочу обратить особое внимание.Зайдите внутрь, конкретный код выглядит следующим образом:
import org.openqa.selenium.*;
import org.openqa.selenium.chrome.ChromeDriver;
public class Main {
private static WebDriver driver;
public static void main(String[] args) throws Exception {
//引用火狐浏览器驱动
System.setProperty("webdriver.chrome.driver", "C:\\selenium\\chromedriver.exe");
driver = new ChromeDriver();
driver.manage().window().maximize();
//以下为Katalon Recorder录制后的脚本
driver.get("https://www.baidu.com/index.php?tn=monline_3_dg");
Thread.sleep(2000);
driver.findElement(By.id("kw")).click();
driver.findElement(By.id("kw")).clear();
driver.findElement(By.id("kw")).sendKeys("掘金网");
Thread.sleep(100);
driver.findElement(By.id("su")).click();
Thread.sleep(1000);
driver.findElement(By.xpath("//div[@id='container']/div[2]/div")).click();
driver.findElement(By.linkText("掘金- juejin.im - 一个帮助开发者成长的社区")).click();
Thread.sleep(3000);
// ERROR: Caught exception [ERROR: Unsupported command [selectWindow | win_ser_1 | ]]
driver.findElement(By.xpath("//div[@id='juejin']/div[2]/div/header/div/nav/ul/li[2]/form/input")).click();
driver.findElement(By.xpath("//div[@id='juejin']/div[2]/div/header/div/nav/ul/li[2]/form/input")).click();
driver.findElement(By.xpath("//div[@id='juejin']/div[2]/div/header/div/nav/ul/li[2]/form/input")).clear();
driver.findElement(By.xpath("//div[@id='juejin']/div[2]/div/header/div/nav/ul/li[2]/form/input")).sendKeys("我是如何重构整个研发项目,促进自动化运维DevOps的落地?");
driver.findElement(By.xpath("//div[@id='juejin']/div[2]/div/header/div/nav/ul/li[2]/form/input")).sendKeys(Keys.ENTER);
Thread.sleep(2000);
driver.findElement(By.linkText("我是如何重构整个研发项目,促进自动化运维DevOps的落地?")).click();
}
}
Комментарии в приведенном выше коде представляют собой сценарии, экспортированные Katalon Recorder, но мы добавили некоторые операции задержки.Существует три типа задержки селена: обычный сон, режим ожидания отображения и неявный режим ожидания. Вот простой и грубый, используйте Thread.sleep(*); задержка, например, задержка открытия Baidu 2 секунды, задержка ввода «Самородки» 100 миллисекунд, задержка 3 секунды после поиска......
К сожалению, наш код сообщил об ошибке:
Это, вероятно, означает, что окно поиска не было найдено по тайм-ауту.По разным причинам скрипт, который мы записали в браузере Firefox, не будет совместим с браузером Google в java-коде.В настоящее время нам нужно проанализировать конкретный логика. .Это связано с тем, что новое окно должно переключать окна, вы можете использовать следующий код для переключения (замените строку // ОШИБКА: пойманное исключение [ОШИБКА: неподдерживаемая команда [selectWindow | win_ser_1 | ]] в коде).
Set<String> windowHandles = driver.getWindowHandles();
String windowHandle = driver.getWindowHandle();
for (String handle : windowHandles) {
if (!handle.equals(driver.getWindowHandle())) {
driver.switchTo().window(handle);
break;
}
}
Экспортированный скрипт By.xpath("//div[@id='juejin']/div[2]/div/header/div/nav/ul/li[2]/form/input") очень сложный, давайте попробуй упростить.
<input data-v-5ce25e66="" maxlength="32" placeholder="搜索掘金" class="search-input">
Сначала найдите стиль ввода для поиска, чтобы увидеть, есть ли на странице только один стиль ввода для поиска.
Разумеется, стиль ввода для поиска имеет только одну метку.Так что мы будем
By.xpath("//div[@id='juejin']/div[2]/div/header/div/nav/ul/li[2]/form/input")
//改为
By.className("search-input")
окончательный код
import org.openqa.selenium.*;
import org.openqa.selenium.chrome.ChromeDriver;
import java.util.Set;
public class Main {
private static WebDriver driver;
public static void main(String[] args) throws Exception {
//引用火狐浏览器驱动
System.setProperty("webdriver.chrome.driver", "C:\\selenium\\chromedriver.exe");
driver = new ChromeDriver();
driver.manage().window().maximize();
driver.get("https://www.baidu.com/index.php?tn=monline_3_dg");
Thread.sleep(2000);
driver.findElement(By.id("kw")).click();
driver.findElement(By.id("kw")).clear();
driver.findElement(By.id("kw")).sendKeys("掘金网");
Thread.sleep(100);
driver.findElement(By.id("su")).click();
Thread.sleep(1000);
driver.findElement(By.xpath("//div[@id='container']/div[2]/div")).click();
driver.findElement(By.linkText("掘金- juejin.im - 一个帮助开发者成长的社区")).click();
Thread.sleep(7000);
Set<String> windowHandles = driver.getWindowHandles();
String windowHandle = driver.getWindowHandle();
for (String handle : windowHandles) {
if (!handle.equals(driver.getWindowHandle())) {
driver.switchTo().window(handle);
break;
}
}
// ERROR: Caught exception [ERROR: Unsupported command [selectWindow | win_ser_1 | ]]
driver.findElement(By.xpath("//div[@id='juejin']/div[2]/div/header/div/nav/ul/li[2]/form/input")).click();
driver.findElement(By.xpath("//div[@id='juejin']/div[2]/div/header/div/nav/ul/li[2]/form/input")).click();
driver.findElement(By.xpath("//div[@id='juejin']/div[2]/div/header/div/nav/ul/li[2]/form/input")).clear();
driver.findElement(By.xpath("//div[@id='juejin']/div[2]/div/header/div/nav/ul/li[2]/form/input")).sendKeys("我是如何重构整个研发项目,促进自动化运维DevOps的落地?");
driver.findElement(By.xpath("//div[@id='juejin']/div[2]/div/header/div/nav/ul/li[2]/form/input")).sendKeys(Keys.ENTER);
Thread.sleep(2000);
driver.findElement(By.linkText("我是如何重构整个研发项目,促进自动化运维DevOps的落地?")).click();
}
}
Скомпилировать и упаковать
Получите пакет selenium.jar, который можно скопировать в C:\selenium на том же уровне, что и chromedriver.exe.Введите команду cmdC:\Users\Administrator>cd C:\selenium
C:\selenium>java -jar selenium2.jar
Вы можете запустить его автоматически, загрузите другие версии 2.40 для не-Windows систем https://npm.taobao.org/mirrors/chromedriver/2.40/
проект github работает
https://github.com/qq273681448/selenium
Чтобы читатели не могли изменить зеркало библиотеки maven, пакеты lib помещаются в проект. Открыть непосредственно с помощью idea, возможно, потребуется изменить некоторые конфигурации, см.
напиши в конце
На этом этапе настроена базовая версия селенового фреймворка, после чего вы можете подключаться к базе данных, случайным образом извлекать учетные записи из библиотеки и выполнять тестирование проекта. Он также может взаимодействовать со сценариями bat для реализации автоматического тестирования и создания отчетов.