<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Pawan Garia</title>
    <description>The latest articles on Forem by Pawan Garia (@pgaria).</description>
    <link>https://forem.com/pgaria</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F426865%2F8667078d-eea5-4fee-b1bb-1f62cbfce67b.PNG</url>
      <title>Forem: Pawan Garia</title>
      <link>https://forem.com/pgaria</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/pgaria"/>
    <language>en</language>
    <item>
      <title>Secret Repo in GIT Hub</title>
      <dc:creator>Pawan Garia</dc:creator>
      <pubDate>Wed, 22 Jul 2020 12:12:01 +0000</pubDate>
      <link>https://forem.com/pgaria/secret-repo-in-git-hub-1bgn</link>
      <guid>https://forem.com/pgaria/secret-repo-in-git-hub-1bgn</guid>
      <description>&lt;p&gt;Found something very Interesting today about the GitHub.&lt;/p&gt;

&lt;p&gt;In GitHub you can create a Repo with your username and this is the Repo content would be the homepage and You can write for example some details about yourself in the .md file and this would be highlighted on the Github home page.&lt;/p&gt;

&lt;p&gt;Just Enter the name of your GitHub User.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--v1lUKxCS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/0a8lcchg2lrhl989w2a0.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--v1lUKxCS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/0a8lcchg2lrhl989w2a0.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Update and write something in your Readme.md file in the Repo and You have the new GitHub Landing page which shows this Read.md file content.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--g-KrUlY_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/nrqakgkartksklndeynl.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--g-KrUlY_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/nrqakgkartksklndeynl.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Try yourself and Enjoy :)&lt;/p&gt;

</description>
      <category>github</category>
    </item>
    <item>
      <title>Browser Automation using Curl and ChromeDriver</title>
      <dc:creator>Pawan Garia</dc:creator>
      <pubDate>Sat, 11 Jul 2020 22:39:54 +0000</pubDate>
      <link>https://forem.com/pgaria/browser-automation-using-curl-and-chromedriver-49ad</link>
      <guid>https://forem.com/pgaria/browser-automation-using-curl-and-chromedriver-49ad</guid>
      <description>&lt;p&gt;Browser automation from &lt;a href="https://en.wikipedia.org/wiki/Command-line_interface"&gt;command-line&lt;/a&gt; is possible after the release of HTTP servers like &lt;a href="https://seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/chrome/ChromeDriver.html"&gt;ChromeDriver&lt;/a&gt;, &lt;a href="https://github.com/mozilla/geckodriver/releases"&gt;GeckoDriver&lt;/a&gt; which are implementing the &lt;a href="https://w3c.github.io/webdriver/webdriver-spec.html"&gt;W3C WebDriver standard&lt;/a&gt; and follow all the standards of a normal server-client architecture in HTTP.&lt;/p&gt;

&lt;p&gt;In my other posts, I have &lt;a href="https://www.pawangaria.com/post/automation/selenium-webdriver-architecture-using-json-wire-protocol/"&gt;described what is JSONWire Protocol&lt;/a&gt; and how it became a standard for the browser automation. I also described &lt;a href="https://www.pawangaria.com/post/automation/browser-automation-using-chromedriver-and-postman/"&gt;how we can perform browser automation using postman tool&lt;/a&gt;. Now in this article, I will show you how we can use simple curl HTTP commands to drive Chrome Browser.&lt;/p&gt;

&lt;h4&gt;
  
  
  Start ChromeDriver Server:
&lt;/h4&gt;

&lt;p&gt;First, &lt;a href="https://sites.google.com/a/chromium.org/chromedriver/downloads"&gt;download&lt;/a&gt; the ChromeDriver and unzip the ChromeDriver to a particular directory. Now we need to first start the ChromeDriver Server like :&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;On Linux or Mac machines:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;./chromedriver &amp;amp;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;On Windows machine:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;chromedriver.exe
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;After the successful start of the server you will see the following message on the terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Starting ChromeDriver 2.33.506106 (8a06c39c4582fbfbab6966dbb1c38a9173bfb1a2) on port 9515
Only local connections are allowed.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h4&gt;
  
  
  Check Curl on your machine:
&lt;/h4&gt;

&lt;p&gt;We will be using the &lt;a href="https://curl.haxx.se/"&gt;Curl&lt;/a&gt; tool for the request and response, So the curl should be installed on your machine.&lt;br&gt;
&lt;strong&gt;What is Curl&lt;/strong&gt;&lt;br&gt;
Curl is a command-line tool to transfer data. Curl support many of the data transfer protocols like DICT, FILE, FTP, FTPS, Gopher, HTTP, HTTPS, etc. Curl is a free and open-source project so there is no need for license or purchase. Anyone can install and start using curl. You can read more about Curl in the Following &lt;a href="https://www.gitbook.com/book/bagder/everything-curl/details"&gt;Git Book everything-curl.&lt;/a&gt; and &lt;a href="https://curl.haxx.se/docs/manpage.html"&gt;Curl documentation page&lt;/a&gt;.&lt;br&gt;&lt;br&gt;
Curl can be downloaded from their &lt;a href="https://curl.haxx.se/download.html"&gt;website.&lt;/a&gt;. Windows Users can follow instructions from the following &lt;a href="https://stackoverflow.com/questions/9507353/how-do-i-install-set-up-and-use-curl-on-windows"&gt;link&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to Check Curl on your machine&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Open Command Line/Terminal on your machine and type following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ curl -V

curl 7.43.0 (x86_64-apple-darwin15.0) libcurl/7.43.0 SecureTransport zlib/1.2.5
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp
Features: AsynchDNS IPv6 Largefile GSS-API Kerberos SPNEGO NTLM NTLM_WB SSL libz UnixSockets

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;This command will print the Curl version installed on your machine.&lt;/p&gt;

&lt;p&gt;Now after running ChromeDriver and installing Curl successfully on our machine, we can start the steps for browser automation.&lt;/p&gt;

&lt;h4&gt;
  
  
  Step 1: Create a Session and Open Chrome Browser:
&lt;/h4&gt;

&lt;p&gt;The first step is to create a session and you will see the browser is opened after this curl command.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl  -d '{ "desiredCapabilities": { "caps": { "nativeEvents": false, "browserName": "chrome", "version": "", "platform": "ANY" } } }'  http://localhost:9515/session
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;





&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{"sessionId":"27f4262ab044392b05138540055a8fd6","status":0}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Note down the SessionID from the response as we need the session Id for future requests&lt;/em&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Step 2: Open Google.com URL:
&lt;/h4&gt;

&lt;p&gt;Now after getting the session we will open the website url &lt;a href="http://www.Google.com"&gt;www.Google.com&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl -d '{"url":"https://www.google.com"}'http://localhost:9515/session/27f4262ab044392b05138540055a8fd6/url
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;





&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{"sessionId":"27f4262ab044392b05138540055a8fd6","status":0,"value":null}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h4&gt;
  
  
  Step 3: Find the Search TextBox WebElement:
&lt;/h4&gt;

&lt;p&gt;As we have opened the URL and now we need to find the Search text box WebElement.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl -d '{"using":"name","value":"q"}' http://localhost:9515/session/27f4262ab044392b05138540055a8fd6/element
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;





&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{"sessionId":"27f4262ab044392b05138540055a8fd6","status":0,"value":{"ELEMENT":"0.676163294199567-1"}}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Note down the ELEMENT Value from the response as this ElementID is representing the Element&lt;/em&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Step 4: Enter Text in SearchBox WebElement:
&lt;/h4&gt;

&lt;p&gt;Now we have the ElementID in which we want to send some text, So below Curl request will enter the text.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl -d '{"value":["chrome"]}' http://localhost:9515/session/27f4262ab044392b05138540055a8fd6/element/0.676163294199567-1/value
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;





&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{"sessionId":"27f4262ab044392b05138540055a8fd6","status":0,"value":null}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h4&gt;
  
  
  Step 4: Quit the Browser:
&lt;/h4&gt;

&lt;p&gt;After Running the Steps We need to close the browser using the below curl command.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl -X DELETE http://localhost:9515/session/27f4262ab044392b05138540055a8fd6
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;





&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{"sessionId":"27f4262ab044392b05138540055a8fd6","status":0,"value":null}}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;I have described and used very basic actions on the browser in this article but with the knowledge of &lt;a href="https://github.com/SeleniumHQ/selenium/wiki/JsonWireProtocol"&gt;WebDiver Json Wire Protocol&lt;/a&gt;, we can perform any action which can be done by Selenium WebDriver. Below is the small GIF for all the steps and action which we have discussed in this article.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--CCA0h2mP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/jet3f3vtt9kkd3xg6yg4.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--CCA0h2mP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/jet3f3vtt9kkd3xg6yg4.gif" alt="chromedriver-and-curl-to-automate-browser"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thanks for Reading!&lt;/p&gt;

</description>
      <category>webdriver</category>
      <category>selenium</category>
      <category>chromedriver</category>
      <category>testing</category>
    </item>
    <item>
      <title>Understanding the Architecture of Selenium WebDriver</title>
      <dc:creator>Pawan Garia</dc:creator>
      <pubDate>Wed, 08 Jul 2020 10:23:29 +0000</pubDate>
      <link>https://forem.com/pgaria/understanding-the-architecture-of-selenium-webdriver-12ob</link>
      <guid>https://forem.com/pgaria/understanding-the-architecture-of-selenium-webdriver-12ob</guid>
      <description>&lt;p&gt;&lt;a href="http://www.seleniumhq.org/projects/webdriver/"&gt;Selenium WebDriver&lt;/a&gt; provides a programming interface for driving the browser for automation testing. You can find the introduction of WebDriver in my other &lt;a href="https://www.pawangaria.com/post/automation/what-is-selenium-webdriver/"&gt;article&lt;/a&gt;. This article is more about architecture and understanding how selenium WebDriver uses JSON Wire Protocol.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/SeleniumHQ/selenium/wiki/JsonWireProtocol"&gt;JSON Wire Protocol&lt;/a&gt; is an abstract specification of how automation behavior like clicking or typing or whatever you actually want to do with your automation script is mapped to selenium or appium or HTTP requests and response.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why JSON Wire Protocol used in the first place?
&lt;/h3&gt;

&lt;p&gt;To implement a client-server architecture that can give us the following benefits.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; You write tests in any programming language.&lt;/li&gt;
&lt;li&gt;You can perform or run test on cloud services like &lt;a href="https://saucelabs.com/"&gt;SauceLabs&lt;/a&gt;, &lt;a href="https://www.browserstack.com/"&gt;BrowserStack&lt;/a&gt; or &lt;a href="http://www.seleniumhq.org/projects/grid/"&gt;Selenium Grid&lt;/a&gt; setup.&lt;/li&gt;
&lt;li&gt;You are not bound to run tests only on the local machine.&lt;/li&gt;
&lt;li&gt;Different Drivers(FirefoxDriver, ChromeDriver) can be created for browsers and separate implementation by using the same standards.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So client-server implementation requires a standard set of the specification beforehand so that Server and Client should be in sync with each other in terms of what is coming and going on request and response. It's something like a language of communication with each other. So we need some common specifications to solve this kind of requirement and the solution is HTTP.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why HTTP is the solution?
&lt;/h3&gt;

&lt;p&gt;HTTP is a standard for the web and can be a good base for the specification. Every &lt;a href="https://en.wikipedia.org/wiki/Programming_language"&gt;programming language&lt;/a&gt; has a good HTTP library that can be used for creating client and server for request and response calls.  &lt;/p&gt;

&lt;h3&gt;
  
  
  How JSON Wire protocol works with HTTP?
&lt;/h3&gt;

&lt;p&gt;HTTP request and response are generally made of &lt;strong&gt;verbs, route, body and response code&lt;/strong&gt; which I am explaining here in details:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;HTTP Verbs:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;GET: Retrieve some information from server for example: &lt;em&gt;getText, getTitle&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;POST: Make something happen for example: &lt;em&gt;startSession, findElement, Click&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;DELETE: Delete some resource for example: &lt;em&gt;deleteSession&lt;/em&gt;   &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;HTTP Route:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;There are many routes in JSON Wire Protocol used by WebDriver which you can check out &lt;a href="https://github.com/SeleniumHQ/selenium/wiki/JsonWireProtocol#command-summary"&gt;here&lt;/a&gt;. Few examples:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET   /status

POST  /session

GET   /Session
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ac1BsXXj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ga56942qdp3jlgyx1xci.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ac1BsXXj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ga56942qdp3jlgyx1xci.png" alt="client server request response in webdriver"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;HTTP Response Code:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;HTTP status codes are not specific enough for all the kind of things that might happen in Selenium WebDriver testing session. So for a specific case like &lt;em&gt;NoSuchElement&lt;/em&gt; or Errors, we have a status code so that client can give particular and useful information back to the user. There are many response codes defined in WebDriver which you can find &lt;a href="https://github.com/SeleniumHQ/selenium/wiki/JsonWireProtocol#response-status-codes"&gt;here&lt;/a&gt; in details but here are some examples:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;0:   Success
7:   NoSuchElement
11:  ElementNotVisible
200: Everything OK
500: Something is wrong
404: Resource not there
501: Valid request but action not done by the server
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;HTTP Request and Response Body:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Everything is JSON in the request and response body. JSON is used for data transfer between client and server.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;JSON Wire Protocol Request&lt;/em&gt; has route and body described in JSON like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;POST /session
{"desiredCapabilities" : {"browserName" : "chrome"}}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;em&gt;JSON Wire Protocol Response&lt;/em&gt; has status code and value in the body like a successful findElement request will give you the following response:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{"status" : 0, "value" : {"element" : "123422"}}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  How Test work with HTTP and JSON Wire Protocol?
&lt;/h3&gt;

&lt;p&gt;HTTP is a &lt;a href="https://stackoverflow.com/questions/13200152/why-say-that-http-is-a-stateless-protocol"&gt;stateless protocol&lt;/a&gt; which means multiple requests are not associated with each other and server is not required to track the state of a particular client's previous request. Your test might be getting an Element in one request and clicking on the same Element in some another request, So Client and Server should share &lt;a href="https://seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/remote/server/Session.html"&gt;session&lt;/a&gt;, element, frame, etc. with each other in subsequent requests.&lt;br&gt;
So the server assigns a unique ID to these Items like session and Element and then shares them with Client. The client can decide in the request like what needs to be done on the particular ID like click on an element.&lt;/p&gt;

&lt;p&gt;Client makes a &lt;a href="https://seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/remote/server/handler/FindElement.html"&gt;findElement&lt;/a&gt; call to the server and gets the response:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  Request:  POST  /session/::sessionId/element
  Response: {“status”:0, “value”:{“element":”elementID”}}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Now the client knows the elementID from the previous request's response and sends a click request with elementID.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   Request:  POST  /session/::sessionId/element/::elementID/click
   Response: {“status” : 0}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  What WebDriver is doing in JSON Wire protocol?
&lt;/h3&gt;

&lt;p&gt;Selenium WebDriver is a client which is giving an interface to write tests in programming languages like Java or Python or many other languages in the market. The server doesn't care or know about what language you are using for writing your tests because it only cares about the correct protocol which is &lt;strong&gt;JSON Wire protocol&lt;/strong&gt;. So you can also make your own Selenium Webdriver in your choice of programming language. :)  &lt;/p&gt;

&lt;p&gt;Thanks for reading!&lt;/p&gt;

</description>
      <category>webdriver</category>
      <category>jsonwiteprotocol</category>
      <category>selenium</category>
      <category>testing</category>
    </item>
  </channel>
</rss>
