2016-12-31 2 views
0

Запуск интеграционного теста с Selenium в качестве тестового бегуна и webdriver.io javascript-библиотека для Selenium API. Мой тест выглядит следующим образом: Я загружаю html-страницу и нажимаю на кнопку. Я хочу проверить, был ли вызван вызов Get REST.Захват вызовов REST с помощью Selenium

Я нашел плагин для webdriver.io под названием webdriverajax, который намеревается соответствовать моим требованиям, но он просто не работает.

Любые идеи о том, как звонки с захватом отдыха?

ответ

0

Вы можете достичь этого, используя специальный класс HttpClient, который находится вне поля кода селена. Насколько я знаю, селен не поддерживает эту функцию.

Предположим, при нажатии на кнопку она называется REST обслуживание, URL может быть захватить с HTMLDOM element.Then вы можете использовать свой собственный код, чтобы проверить, если URL доступен или not.Then вы можете решить, если ваш тест проходит или проваливается на основе status code или какого-либо другого вашего механизма.

FileDownloader.java (образец фрагмент кода)

private String downloader(WebElement element, String attribute) throws IOException, NullPointerException, URISyntaxException { 
     String fileToDownloadLocation = element.getAttribute(attribute); 
     if (fileToDownloadLocation.trim().equals("")) throw new NullPointerException("The element you have specified does not link to anything!"); 

     URL fileToDownload = new URL(fileToDownloadLocation); 
     File downloadedFile = new File(this.localDownloadPath + fileToDownload.getFile().replaceFirst("/|\\\\", "")); 
     if (downloadedFile.canWrite() == false) downloadedFile.setWritable(true); 

     HttpClient client = new DefaultHttpClient(); 
     BasicHttpContext localContext = new BasicHttpContext(); 

     LOG.info("Mimic WebDriver cookie state: " + this.mimicWebDriverCookieState); 
     if (this.mimicWebDriverCookieState) { 
      localContext.setAttribute(ClientContext.COOKIE_STORE, mimicCookieState(this.driver.manage().getCookies())); 
     } 

     HttpGet httpget = new HttpGet(fileToDownload.toURI()); 
     HttpParams httpRequestParameters = httpget.getParams(); 
     httpRequestParameters.setParameter(ClientPNames.HANDLE_REDIRECTS, this.followRedirects); 
     httpget.setParams(httpRequestParameters); 

     LOG.info("Sending GET request for: " + httpget.getURI()); 
     HttpResponse response = client.execute(httpget, localContext); 
     this.httpStatusOfLastDownloadAttempt = response.getStatusLine().getStatusCode(); 
     LOG.info("HTTP GET request status: " + this.httpStatusOfLastDownloadAttempt); 
     LOG.info("Downloading file: " + downloadedFile.getName()); 
     FileUtils.copyInputStreamToFile(response.getEntity().getContent(), downloadedFile); 
     response.getEntity().getContent().close(); 

     String downloadedFileAbsolutePath = downloadedFile.getAbsolutePath(); 
     LOG.info("File downloaded to '" + downloadedFileAbsolutePath + "'"); 

     return downloadedFileAbsolutePath; 
    } 

TestClass.java

@Test 
public void downloadAFile() throws Exception { 


     FileDownloader downloadTestFile = new FileDownloader(driver); 
     driver.get("http://www.localhost.com/downloadTest.html"); 
     WebElement downloadLink = driver.findElement(By.id("fileToDownload")); 
     String downloadedFileAbsoluteLocation = downloadTestFile.downloadFile(downloadLink); 

     assertThat(new File(downloadedFileAbsoluteLocation).exists(), is(equalTo(true))); 
     assertThat(downloadTestFile.getHTTPStatusOfLastDownloadAttempt(), is(equalTo(200))); 
// you can use status code to valid the REST URL 
    } 

Here является ссылкой.

Примечание: Это может не соответствовать вашим требованиям, но вы можете получить некоторую идею и изменить ее, чтобы она соответствовала вашим требованиям.

Также см. BrowserMob Proxy, используя это, вы также можете достичь того, чего хотите.

0

Проблема была версия webdriver.io. По-видимому, webdriverajax отлично работает только с webdriver.io v3.x, но не с v4.x. Я использую v4.5.2.

Я решаю не используя плагин и реализовать макет для window.XMLHttpRequest открытого и отправить методы, а именно:

proxyXHR() { 
    this.browser.execute(() => { 
    const namespace = '__scriptTests'; 
    window[namespace] = { open: [], send: [] }; 
    const originalOpen = window.XMLHttpRequest.prototype.open; 
    window.XMLHttpRequest.prototype.open = function (...args) { 
     window[namespace].open.push({ 
     method: args[0], 
     url: args[1], 
     async: args[2], 
     user: args[3], 
     password: args[4] 
     }); 
     originalOpen.apply(this, [].slice.call(args)); 
    }; 
    window.XMLHttpRequest.prototype.send = function (...args) { 
     window[namespace].send.push(JSON.parse(args[0])); 
    }; 
    }); 
} 

getXHRsInfo() { 
    const result = this.browser.execute(() => { 
    const namespace = '__scriptTests'; 
    return window[namespace]; 
    }); 
    return result.value; 
}