Проверка наличия интернета и доступа к сайту,перед запуском тестов в SeLenium

Добрый день!возник вопрос,запускаю тесты при отсутствии интернета или отсутствия доступа к сайту и тесты проходят успешно,как сделать так ,чтобы перед тестом сначала проверялось наличие доступа к сайту и наличие интернета,а потом тесты соответственно ответу запускались либо не запускались?Небольшой пример теста:

public class FormLogInWithClickLinkImageDns1 {
    public static void formlogInWithClickLinkImageDns1()

    {
        WebDriver driver = new FirefoxDriver();
        driver.manage().window().maximize();
        driver.get("http://www.dns-shop.ru/");
        driver.manage().deleteAllCookies();
        WebElement searchButton = driver.findElement(By.cssSelector("a#loginButton.dropdown-toggle"));
        searchButton.click();
        driver.manage().timeouts().implicitlyWait(40, TimeUnit.SECONDS);
        WebElement searchField = driver.findElement(By.xpath("html/body/div[1]/div[2]/div[1]/div[1]/a/div"));
        searchField.click();
        driver.getCurrentUrl();
        Assert.assertEquals("http://www.dns-shop.ru/", "http://www.dns-shop.ru/");
        driver.manage().timeouts().implicitlyWait(40, TimeUnit.SECONDS);
        driver.quit();

    }
}

Если нет доступа к сайту, то у вас тест будет failed, так как банально не найдет элемент.

1 лайк

У вас assert будет всегда true.
Плюс сама структура теста говорит о том, что у вас большие проблемы в архитектурном плане.

1 лайк

В архитектурном плане как лучше составлять тесты?недавно только начал составлять,здесь пример созданного отдельного класса который вызываю в главном классе и все тесты находятся отдельно, чтобы удобней было править,так перед запуском тестов можно же как то проверить ,что есть интернет?и проверить перед тестом если доступ к сайту?а потом уже запускать тест

Проверьте как нибудь http клиентом GET запрос к ресурсу (URL сайта) - вернет ли 200 … но есть такие настройки firewall - а например, когда ping проходит, а браузер все равне страницу не залодит

1 лайк

занимательная структура )
где собственно сам тест ? ))
и как вы в таком случае запускаете выполнение вашего сценария ? )
скорее всего вы запускаете пустой тест и потому резалт = тру

Давайте немного проясним:

  • сначала создается драйвер;
  • потом у вас открывается барузер;
  • потом вы передаете url в адрессную строку.

Вопрос что будет вам показывать если не будет интернет?
Ответ: There is no Internet connection с динозавриком в хроме :slight_smile:

Последующие действие вашего теста - поиск веб элемента. Но его нет на странице, поэтому у вас должна появится ошибка о том, что веб элемента не найден.

По поводу структуры напишу позже :slight_smile:

да там в Assert неправильно указанного было, URL надо было сравнивать с адресом,сам тест именно заключается в том что: перейти на сайт>найти и нажать кнопку"Войти">там найти элемент, нажать на него>после нажатия элемента взять текущий адрес и сравнить с нужным адресом…Чем не тест?где он пустой?(конечно, до исправления ошибки тест пустой был)

public class FormLogInWithClickLinkImageDns1 {
    public static void formlogInWithClickLinkImageDns1()

    {
        WebDriver driver = new FirefoxDriver();
        driver.manage().window().maximize();
        driver.get("http://www.dns-shop.ru/");
        driver.manage().deleteAllCookies();

        //Найти и Нажать кнопку Войти
        WebElement searchButton = driver.findElement(By.cssSelector("a#loginButton.dropdown-toggle"));
        searchButton.click();
        driver.manage().timeouts().implicitlyWait(40, TimeUnit.SECONDS);

        // Поиск элемента и сравнение на какой сайт перешел после нажатия
        WebElement searchField = driver.findElement(By.xpath("html/body/div[1]/div[2]/div[1]/div[1]/a/div"));
        searchField.click();
        driver.getCurrentUrl();//Адрес страницы после нажатия кнопки Элемента
        Assert.assertEquals( URL , "http://www.dns-shop.ru/");//Сравнение адреса страницы после нажатия кнопки и нужного адреса
        driver.manage().timeouts().implicitlyWait(40, TimeUnit.SECONDS);
        driver.quit();


    }
}

предполагаю, что вы хотели сделать так:

String currentUrl = driver.getCurrentUrl();
Assert.assertEquals( currentUrl , "http://www.dns-shop.ru/");
1 лайк

ну да,это имел ввиду, вопрос только в другом был

у меня встречный вопрос, подскажите пожалуйста, откуда появилась идея перед тестами проверять наличие интернета? С чего в друг такая задача у вас в голове появилась? Еще интересует, какую задачу вам кажется вы хотите этим решить?

Вы подумали, что проверка наличия интерната будет не лишним? Или вам поставили такую задачу?

Задаю эти вопросы, поскольку никогда и ни где не видел такую проверку перед тестами. Это реально делают только в уж очень редких случаях…

Может есть смысл отговорить вас от этой задачки и как вам уже подсказывали выше - происходит такая проверка, как правило косвенно. То есть - открывается браузер, грузится страница, и происходит попытка поиска элемента.

1 лайк

Если нет сети, так или иначе, вы скорей всего получите чето подобное - java.net.SocketException: Network is unreachable, и узнаете, что нет сети :slight_smile:

1 лайк

Хотел попробовать при исключениях чтобы тесты не падали ,а выдавали сообщения о конкретной возникшей проблеме.Вроде как понял можно же SocketException исключение прописать и в ответ на него поставить “Нет интернета” допустим

ссори, это у меня на API тестах такое выходит, при открыии браузера просто не находит элемент:

12:53:38.989 [TestNG] [INFO ] com.casino.apps.listeners.TestListener - starting com.casino.RegistrationTest.playCases
Element not found {#id_username}
Expected: visible
Screenshot: file:/Users/apple/Desktop/web-casino/build/reports/tests/1494237203533.0.png
Timeout: 4 s.
Caused by: NoSuchElementException: no such element: Unable to locate element: {"method":"css selector","selector":"#id_username"}
	at com.codeborne.selenide.impl.WebElementSource.createElementNotFoundError(WebElementSource.java:31)
	at com.codeborne.selenide.impl.ElementFinder.createElementNotFoundError(ElementFinder.java:82)
	at com.codeborne.selenide.impl.WebElementSource.checkCondition(WebElementSource.java:59)
	at com.codeborne.selenide.impl.WebElementSource.findAndAssertElementIsVisible(WebElementSource.java:72)
	at com.codeborne.selenide.commands.SetValue.execute(SetValue.java:20)
	at com.codeborne.selenide.commands.SetValue.execute(SetValue.java:13)
	at com.codeborne.selenide.commands.Commands.execute(Commands.java:140)
	at com.codeborne.selenide.impl.SelenideElementProxy.dispatchAndRetry(SelenideElementProxy.java:86)
	at com.codeborne.selenide.impl.SelenideElementProxy.invoke(SelenideElementProxy.java:62)
	at com.sun.proxy.$Proxy27.setValue(Unknown Source)
	at com.casino.pages.landings.RegistrationPage.fillRegistrationForm(RegistrationPage.java:17)
	at com.casino.RegistrationTest.beforeTestClass(RegistrationTest.java:25)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:84)
	at org.testng.internal.Invoker.invokeConfigurationMethod(Invoker.java:564)
	at org.testng.internal.Invoker.invokeConfigurations(Invoker.java:213)
	at org.testng.internal.Invoker.invokeConfigurations(Invoker.java:138)
	at org.testng.internal.TestMethodWorker.invokeBeforeClassMethods(TestMethodWorker.java:175)
	at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:107)
	at org.testng.TestRunner.privateRun(TestRunner.java:767)
	at org.testng.TestRunner.run(TestRunner.java:617)
	at org.testng.SuiteRunner.runTest(SuiteRunner.java:348)
	at org.testng.SuiteRunner.access$000(SuiteRunner.java:38)
	at org.testng.SuiteRunner$SuiteWorker.run(SuiteRunner.java:382)
	at org.testng.internal.thread.ThreadUtil$2.call(ThreadUtil.java:64)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at java.lang.Thread.run(Thread.java:745)
Caused by: org.openqa.selenium.NoSuchElementException: no such element: Unable to locate element: {"method":"css selector","selector":"#id_username"}
  (Session info: chrome=57.0.2987.133)
  (Driver info: chromedriver=2.29.461585 (0be2cd95f834e9ee7c46bcc7cf405b483f5ae83b),platform=Mac OS X 10.12.4 x86_64) (WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 82 milliseconds
For documentation on this error, please visit: http://seleniumhq.org/exceptions/no_such_element.html
Build info: version: '3.3.1', revision: '5234b325d5', time: '2017-03-10 09:10:29 +0000'
System info: host: 'evgmoskalenko.local', ip: 'fe80:0:0:0:eb28:d797:f2cf:28a7%9', os.name: 'Mac OS X', os.arch: 'x86_64', os.version: '10.12.4', java.version: '1.8.0_92'
Driver info: org.openqa.selenium.chrome.ChromeDriver
Capabilities [{applicationCacheEnabled=false, rotatable=false, mobileEmulationEnabled=false, networkConnectionEnabled=false, chrome={chromedriverVersion=2.29.461585 (0be2cd95f834e9ee7c46bcc7cf405b483f5ae83b), userDataDir=/var/folders/yd/mqvbckgj7tvbncrsx9fz0vhc0000gn/T/.org.chromium.Chromium.WPA57G}, takesHeapSnapshot=true, pageLoadStrategy=normal, databaseEnabled=false, handlesAlerts=true, hasTouchScreen=false, version=57.0.2987.133, platform=MAC, browserConnectionEnabled=false, nativeEvents=true, acceptSslCerts=true, locationContextEnabled=true, webStorageEnabled=true, browserName=chrome, takesScreenshot=true, javascriptEnabled=true, cssSelectorsEnabled=true, unexpectedAlertBehaviour=}]
Session ID: 4bb1b5684b95b2a5a348ca65a560ebca
*** Element info: {Using=css selector, value=#id_username}
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
	at org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:216)
	at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:168)
	at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:638)
	at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:371)
	at org.openqa.selenium.remote.RemoteWebDriver.findElementByCssSelector(RemoteWebDriver.java:468)
	at org.openqa.selenium.By$ByCssSelector.findElement(By.java:430)
	at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:363)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.openqa.selenium.support.events.EventFiringWebDriver$2.invoke(EventFiringWebDriver.java:104)
	at com.sun.proxy.$Proxy26.findElement(Unknown Source)
	at org.openqa.selenium.support.events.EventFiringWebDriver.findElement(EventFiringWebDriver.java:188)
	at com.codeborne.selenide.impl.WebElementSelector.findElement(WebElementSelector.java:28)
	at com.codeborne.selenide.impl.ElementFinder.getWebElement(ElementFinder.java:56)
	at com.codeborne.selenide.impl.WebElementSource.checkCondition(WebElementSource.java:44)
	... 29 more
null

так что не получите такую ошибку, проверил :slight_smile: Ссори, что ввел в заблуждение…

1 лайк

да не такое исключение,если добавить NoSuchElementException некорректно будет тест проходить,если не найдет элемент то все равно считаться пройденным будет,а можно перед тестом это проверять наличие интернета/доступа к сайту и только потом запускать или не запускать тест(ну и соответственно если не запускать то вывод конкретной ошибки)

вот так попробуйте как-то:

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import java.net.HttpURLConnection;
import java.net.URL;

public class InternetConnectionUtils {

    private static final Logger logger = LogManager.getLogger(InternetConnectionUtils.class);

    private static boolean checkInternetConnection(String url) {
        Boolean result = false;
        HttpURLConnection con = null;
        try {
            con = (HttpURLConnection) new URL(url).openConnection();
            con.setRequestMethod("HEAD");
            result = (con.getResponseCode() == HttpURLConnection.HTTP_OK);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (con != null) {
                try {
                    con.disconnect();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        return result;
    }

    public static void main(String[] args) {
        checkInternetConnection("http://www.dns-shop.ru/");
    }

Посмотрите по этой ссылке:

создайте класс, отдельный с проверкой. Перед тестами дергайте его, и проверяйте, если ок, тогда запускайте, если нет, то выводите какую-то ошибку…

3 лайка

вот это имел ввиду,благодарю !

не за что :slight_smile: ранее никогда не видел, чтобы кто-то заморачивался с подобной ошибкой :slight_smile:

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

Совсем упоролись, что значит нету инета, нету инета? Вы что в бункере тестируете

как вариант монжно проверять типа такого -
тут и проверку можна как на страницу так и на сокет соединение , или проверять пинг… так что можно перед стартом веб браузера такую проверочку и запилить)))

2 лайка