Сводка селена (Java версия)

Selenium

Недавно разработан с использованием Selenium, потому что они никогда не использовали его, слишком много ямы, запишите это здесь

1. Конфигурация среды

Точки конфигурации:

1. Вебдрайвер должен соответствовать версии браузера, хром использует хромдрайвер и браузер хром, а фаерфокс использует геккодрайв и браузер фаерфокс

2. Поддержка безголового: локальная разработка использует среду Mac, поддержка по умолчанию; Linux необходимо установить xvf8 (виртуальный графический интерфейс)

3. Проект maven собран с использованием selenium-3.9.1 или последней версии.

4. ссылка на конфигурацию Linux: chrome:Блог.csdn.net/qq_39802740...; Fire Fox:blog.CSDN.net/U014283248/… Woohoo.X Nathan.com/2017/12/04/…

2.использование проекта хрома

Ссылка на параметр запуска Chrome:Питер. Да / Эксперименты ...

1. Конфигурация переменной системной среды: webdriver.chrome.driver = driver_path

2. Конфигурация общих параметров:

-без головы нет режима браузера
--no-sandbox Режим без песочницы, необходимый для развертывания Linux.
--disable-gpu Отключите графический процессор, необходимо заполнить развертывание Linux, чтобы предотвратить неизвестные ошибки.
blink-settings=imagesEnabled=false не загружать изображения
--user-agent=ua значение установить уа

3. создание веб-драйвера:

//设置系统环境变量
System.setProperty("webdriver.chrome.driver", env.getProperty("path.chrome.driver"));
WebDriver webDriver = null;
try{
    ChromeOptions options = new ChromeOptions();
	options.addArguments("--headless"); //无浏览器模式
	options.addExtensions(new File(env.getProperty("path.chrome.proxy")));//增加代理扩展
    webDriver = new ChromeDriver(options);//实例化
}catch(Exception e){
    e.printStackTrace();
}finally{
    //使用完毕,关闭webDriver
    if(webDriver != null){
        webDriver.quit();
    }
}

3. использование проекта геккона

1. Конфигурация переменной системной среды: webdriver.gecko.driver=DRIVER_PATH

2. Конфигурация общих параметров:

-без головы нет режима браузера
--no-sandbox Режим без песочницы, необходимый для развертывания Linux.
--disable-gpu Отключите графический процессор, необходимо заполнить развертывание Linux, чтобы предотвратить неизвестные ошибки.
--user-agent=ua значение установить уа

конфигурация предпочтений:

permissions.default.image 2 не загружать изображения

3. создание веб-драйвера:

//设置系统环境变量
System.setProperty("webdriver.gecko.driver", env.getProperty("path.gecko.driver"));
WebDriver webDriver = null;
try{
    FirefoxOptions options = new FirefoxOptions();
	options.addArguments("--headless"); //无浏览器模式
    FirefoxProfile profile = new FirefoxProfile();
	profile.addExtensions(new File(env.getProperty("path.chrome.proxy")));//增加代理扩展
    profile.setPreference("permissions.default.image", 2);//不显示图片
    options.setProfile(profile);
	//实例化
    webDriver = new FirefoxDriver(options);
}catch(Exception e){
    e.printStackTrace();
}finally{
    //使用完毕,关闭webDriver
    if(webDriver != null){
        webDriver.quit();
    }
}

4. Примечание. Запрос на загрузку экранированной части по умолчанию (запрос JS и т. д.)

4. Проект Selenium использует базовые операции

Ссылаться на:Блог Woo Woo.cn на.com/Lin Xinmeng/…

1. Создание экземпляра WebDriver: см. 2, 3

1. Получить страницу: driver.get(url);

2. Закрыть страницу: driver.close() Закрыть процесс: driver.quit();

2. Загрузка ожидания: используется, когда страница изначально загружается или элемент загружен, тремя способами:

1. Поток вынужден спать и ждать, Thread.sleep(3000);

2. Неявное ожидание (глобальное ожидание), время ожидания, установленное для всех операций, тайм-аут вызовет исключение, driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);

3. Явное ожидание (контролируемое ожидание,Рекомендуемое использование), вы можете установить триггерное событие ожидания и время ожидания для одной операции, вы можете настроить событие, а тайм-аут вызовет исключение

WebDriverWait wait = new WebDriverWait(webDriver, 60);//初始化等待60s
wait.until(ExpectedConditions.presenceOfElementLocated(By.id("xx")));//等待xx元素出现
//自定义等待事件
WebElement frame = wait.until((ExpectedCondition<WebElement>) driver -> {
                WebElement element = driver.findElement(By.id("iframepage"));
                return element;
            });
3. Получите контент
String page = driver.getPageSource();//获取网页全部信息
String url = driver.getCurrentUrl();//获取当前页url
WebElement element = driver.findElement(By.id("xx"));//获取元素
element.sendKeys("test");//设置元素值
element.click();//点击元素
element.sendKeys(Keys.BACK_SPACE);//空格键盘事件模拟
В-четвертых, окно переключения, форма, всплывающее окно:

1. Оборудование

String handle = driver.getWindowHandle();//获取当前窗口句柄
Set<String> handles = driver.getWindowHandles();//获取全部窗口句柄
//切换到另一窗口
for(String h : handles){
    if(!h.equals(handle)){
		driver.switchTo().window(h);//切换窗口
    }else{
        driver.close();
    }
}

2. Операция формы, переключение кадров должно быть получено слой за слоем снаружи внутрь, что может быть обработано в соответствии с pageSource.

driver.switchTo().frame("top");//切换到top Frame
driver.switchTo().frame("inner");//切换到inner Frame

3. Всплывающее окно

Alert alert = webDriver.switchTo().alert();//获取弹窗
if(alert != null){
    alert.sendKeys("123");//设置输入框文本,只能设置一个输入框文本
    alert.getText();//获取弹窗信息
    alert.accept();//点击确认
    alert.dismiss();//点击取消
}
Пять, выполнение js-скрипта
String js = "window.open('http://www.baicu.com')";//js脚本,打开一个新页面
((JavascriptExecutor)driver).executeScript("");//执行js脚本

5. Режим PageFactory

Введение. Интегрированная упаковка упрощает процесс бизнес-операций WebDriver, используя заводской режим с такими аннотациями, как FindBy.

PageGenerator page = new PageGenerator(driver);//抽象page对象
//实例化LoginPage对象,并调用click方法
page.GetInstance(LoginPage.class).click("admin","123456");

LoginPage.java

public class LoginPage extends BasePage{
    private final static String URL = "https://www.testlogin.com";
    @FindBy(id = "login")
    private WebElement login;
    public LoginPage(WebDriver driver) {
        super(driver);
    }
    public Boolean clickLogin(String name, String pwd){
        get(URL);
        click(login);
        return wait(ExpectedConditions.urlContains("main.html"));
    }
}

BasePage.java

public class BasePage extends PageGenerator {
    private Long timeOut = 60L;//默认超时时间60s
    public BasePage(WebDriver driver) {
        super(driver);
    }
    public <T> void get(String url) {
        driver.get(url);
    }
    public <T> T wait(ExpectedCondition<T> c){
        return wait(c, timeOut);
    }
    public <T> T wait(ExpectedCondition<T> c, Long t){
        WebDriverWait webDriverWait = new WebDriverWait(this.driver, t==null?timeOut:t);
        try{
            return webDriverWait.until(c);
        }catch (Exception e){
            return null;
        }
    }
    public <T> void click (T elementAttr) {
        if(elementAttr.getClass().getName().contains("By")) {
            driver.findElement((By) elementAttr).click();
        } else {
            ((WebElement) elementAttr).click();
        }
    }
}

PageGenerator.java

public class PageGenerator {
    public WebDriver driver;
    public PageGenerator(WebDriver driver){
        this.driver = driver;
    }
    public  <T extends BasePage> T GetInstance (Class<T> pageClass) {
        try {
            return PageFactory.initElements(driver,  pageClass);
        } catch (Exception e) {
            e.printStackTrace();
            throw e;
        }
    }
}

6. агенты используют

GitHub.com/легкое тело/нет…

1. Нет прокси-сервера аутентификации
String proxyServer = "1.2.3.4:666";
Proxy proxy = new Proxy().setHttpProxy(proxyServer).setSslProxy(proxyServer);
options.setProxy(proxy);
2. Требуется агент аутентификации

Используйте browsermobproxy в качестве прокси (или другого прокси)

//创建一个本地代理
BrowserMobProxyServer bmpServer = new BrowserMobProxyServer();
bmpServer.setChainedProxy(new InetSocketAddress("proxy.com",222));//代理地址端口
bmpServer.chainedProxyAuthorization("user","pwd",AuthType.BASIC);//代理用户名密码
bmpServer.setTrustAllServers(true);//信任所有服务
bmpServer.start(11112);//启动一个本地代理服务,并设置端口为11112,访问地址:localhost:11112
//使用本地代理
String proxyServer = "localhost:11112";
Proxy proxy = new Proxy().setHttpProxy(proxyServer).setSslProxy(proxyServer);
options.setProxy(proxy);

Локальный агент можно развернуть отдельно, многоузловой, под управлением zk

3. Используйте расширения браузера

1. Расширение Chrome: невозможно использовать расширение загрузки в автономном режиме, проблема не решена.

chromeOptions.addExtensions(new File(env.getProperty("path.chrome.proxy")));//代理扩展  需要在background.js配置代理账号密码后再打包

Ссылаться на:

2. Firefox расширение: нельзя использовать, новая версия Firefox не может быть загружена из-за проблемы аутентификации, которая еще не была решена

3.firefox использует плагин close-proxy-authentication, для использования которого требуется более старая версия:woohoo.site-digger.com/HTML/art ICL… добавить ONS.Thunderbird.net/This-Taiwan/Dizzy и т. д.…

В-четвертых, используйте phantom.js

Новый API селена больше не поддерживает phantom.js, вы можете использовать старый API

Пятая, роль других агентов

1. Создайте черный список

2. Установите заголовок

3. Другое

7. Встречающаяся яма

1. Медленная загрузка страницы: (требуется проверка)

Хотя хром является многопроцессным выполнением, движок js является однопоточным, когда одновременно открыто несколько окон, будет загружена только одна страница, а следующая страница не будет загружена, пока не завершится загрузка или не откроется следующее окно. открыт. См. (blog.CSDN.net/Оуян Гэнчен…

firefox может одновременно загружать страницы нескольких окон и при этом блокировать некоторые запросы по умолчанию

2. Установите черный список: заблокируйте загрузку определенных веб-страниц (то же самое верно для настройки заголовков)

1. Через настройки прокси, браузермобсервер

BrowserMobProxy server = new BrowserMobProxyServer();
server.blacklistRequests("http://.*\\.blacklist.com/.*", 200);//方式1,设置单个黑名单
server.setBlacklist();//方式2,设置黑名单列表

2. Расширяя настройку, временно не проникла в целое

3. Прокси bmp не может подключиться

1. Используйте правильный метод подключения

//错误
Proxy proxy = ClientUtil.createSeleniumProxy(server);//无法获取到代理的host
//正确
String proxyServer = "localhost:11112";
Proxy proxy = new Proxy().setHttpProxy(proxyServer).setSslProxy(proxyServer);

2. Используйте последний пакет maven

В-четвертых, Firefox совместим с использованием расширений Chrome.

developer.Mozilla.org/this-cn/docs/…

5. При использовании прокси-сервера авторизации всплывает окно входа в систему.

1.параметры запретить всплывающее окно

2. Получите предупреждение и закройте всплывающее окно.

Шесть, начало сетки

1. Используйте сетку для начала: права и привилегии chromedriver должны соответствовать сетке

2. Запустите узел сетки: параметр -Dwebdriver.chrome.driver помещается после -jar java -jar -Dwebdriver.chrome.driver=/Users/apple/Downloads/chromedriver selenium-server-standalone-3.141.5.jar -role node -hubhttp://localhost:4444/grid/register -browser browserName=chrome

8. Распределенный

Запустите несколько узлов с сеткой

Примечание: при использовании многопоточности на одном узле лучше всего использовать geckodriver, JS-движок Chromium выполняется в одном потоке.

9. вики, окончание документации

Официальная документация геккона:GitHub.com/Mozilla/ Тексты…

Firefox-source-docs.Mozilla.org/testing/lyrics…

Официальная документация хрома:chrome driver.chromium.org/getting - это он...

10. Проект актуальной боевой стратегии: использование с http запросом, многопоточностью, сеткой