Как задизейблить интернет коннекшен во время теста?

Нужно во время веб теста задизейблить інтернет конекшеш, пропестировать UI і заенейблить назад.
Буду рад любой помощи.

1 лайк

Лучше использовать прокси, например

Linux:
sudo ifdown eth0
sudo ifup eth0

Windows:
netsh interface set interface name=“Имя сетевого адаптера” disable
netsh interface set interface name=“Имя сетевого адаптера” enable

4 лайка

есть пример кода как с помощью browser-mob proxy отрубить трафик ?

Скорее всего тебе надо запускать сами тесты через прокси. И тогда ты сможешь в определенных тестах манипулировать соединением. Из мануала GitHub - lightbody/browsermob-proxy: A free utility to help web developers watch and manipulate network traffic from their AJAX applications.

// start the proxy
BrowserMobProxy proxy = new BrowserMobProxyServer();
proxy.start(0);

// get the Selenium proxy object
Proxy seleniumProxy = ClientUtil.createSeleniumProxy(proxy);

// configure it as a desired capability
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability(CapabilityType.PROXY, seleniumProxy);

// start the browser up
WebDriver driver = new FirefoxDriver(capabilities);

// open yahoo.com
driver.get("http://yahoo.com");

Скорее всего останавливать и запускать соединение можно так: proxy.stop(); и proxy.start();

Если запускать тесты не используя прокси, тогда можно для винды выполнить комманду (Java):

  • отключение интернета: Runtime.getRuntime().exec("netsh wlan disconnect");
  • включение интернета: Runtime.getRuntime().exec("netsh wlan connect name="network_name" ");

Для линукс, как писали выше…

Но это конечно наверное не оч способы для данного решения, все же лучше прокси, так как тесты потом могут выполнятс на разных ПК, кто-то захочет выполнить данный тест на линуксе, кто-то на винде или ты дебажить будешь и писать у себя на винде, а на сервере будет линукс, или у кого-то будет MAC

Вот тут есть хорошее решение запуска тестов через прокси - Browsermob proxy + Java + WebDriver помогите запустить простейший тест, только static надо везде убрать, тестил через main:

import net.lightbody.bmp.BrowserMobProxy;
import net.lightbody.bmp.BrowserMobProxyServer;
import org.openqa.selenium.By;
import org.openqa.selenium.Proxy;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.remote.CapabilityType;
import org.openqa.selenium.remote.DesiredCapabilities;

import java.net.InetAddress;
import java.net.UnknownHostException;

public class Example {

    public static void main(String[] args) throws Exception {
        DesiredCapabilities capabilities = new DesiredCapabilities();
        WebDriver driver = new ChromeDriver(capabilities);
        startServer(capabilities);
        driver.get("http://google.com");
        WebElement search = driver.findElement(By.xpath("//*[@id=\"lst-ib\"]"));
        WebElement button = driver.findElement(By.xpath("//*[@id=\"sblsbb\"]/button"));
        search.clear();
        search.sendKeys("55555");
        button.click();
        driver.quit();
    }

    private static BrowserMobProxy proxyServer;
    private static boolean         isServerStarted;

    public static void startServer(DesiredCapabilities capabilities) {
        proxyServer = new BrowserMobProxyServer(0);
        try {
            proxyServer.start();
            isServerStarted = true;
        } catch (Exception e) {
            throw new RuntimeException("Cant start proxy-server on port: " + proxyServer.getPort(), e);
        }

        Proxy proxy = null;
        try {
            proxy = createHttpProxy(proxyServer.getPort());
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
        createNewHar();
        // configure it as a desired capability
        capabilities.setCapability(CapabilityType.PROXY, proxy);
    }

    private static Proxy createHttpProxy(int port) throws UnknownHostException {
        Proxy proxy = new Proxy();
        proxy.setProxyType(Proxy.ProxyType.MANUAL);
        String proxyStr = String.format("%s:%d", InetAddress.getLocalHost().getCanonicalHostName(),  port);
        proxy.setHttpProxy(proxyStr);
        proxy.setSslProxy(proxyStr);
        return proxy;
    }

    public static void createNewHar(){
        proxyServer.newHar();
    }

    public static void stopServer() {
        if (isServerStarted) {
            try {
                proxyServer.stop();
            } catch (Exception e) {
                throw new RuntimeException("Cant stop proxy server", e);
            }

        }
    }
}

Вот только у меня немного не получилось методом stopServer(), остановить интернет, так как локально он будет, и браузер начнет дальше искать. Почему-то оно не в самом браузере устанавливает настройки данного прокси. Хотя может у мен МАК просто, и на маке прокси ставится глобально в системных настройках…

3 лайка

Используем MITM-прокси, очень удобно. Позволяет не только обрубить интернет, но также ограничить исходящую и (или) входящую скорость, проанализировать запросы и ответы, использовать локальный кэш и многое другое. Однако, это работает на уровне HTTP(S). Если нужно управлять на более низкоуровневых протоколах, то скорее всего нужно думать в сторону SOCKS-прокси (детально к сожалению не разбираюсь)

1 лайк

Только он на питоне. Так что страдайте джаверы. Вобще на джаве тяжело делать что-то, что выходит за рамки виртуальной песочницы, так что лучше делать ОС вызов готовых решений как писали раньше типа netsh или ifup/down (если конечно browserproxy не сработало, оно то будет правильным решением)

1 лайк

https://mitmproxy.org/ - этот да на питоне :slight_smile: Но мы работаем с javascript проектом GlaceJS Index, который в свою очередь базируется на весьма популярных проектах GitHub - http-party/node-http-proxy: A full-featured http proxy for node.js и GitHub - joeferner/node-http-mitm-proxy: HTTP Man In The Middle (MITM) Proxy

1 лайк