Initial commit.
This commit is contained in:
commit
cee5013002
2 changed files with 78 additions and 0 deletions
65
src/webdriver.nim
Normal file
65
src/webdriver.nim
Normal file
|
|
@ -0,0 +1,65 @@
|
||||||
|
import httpclient, uri, json, tables
|
||||||
|
|
||||||
|
type
|
||||||
|
WebDriver* = ref object
|
||||||
|
url*: Uri
|
||||||
|
client*: HttpClient
|
||||||
|
|
||||||
|
Session* = object
|
||||||
|
driver: WebDriver
|
||||||
|
id*: string
|
||||||
|
|
||||||
|
WebDriverException* = object of Exception
|
||||||
|
|
||||||
|
ProtocolException* = object of WebDriverException
|
||||||
|
|
||||||
|
proc newWebDriver*(url: string = "http://localhost:4444"): WebDriver =
|
||||||
|
WebDriver(url: url.parseUri, client: newHttpClient())
|
||||||
|
|
||||||
|
proc createSession*(self: WebDriver): Session =
|
||||||
|
# Check the readiness of the Web Driver.
|
||||||
|
let resp = self.client.getContent($(self.url / "status"))
|
||||||
|
let obj = parseJson(resp)
|
||||||
|
|
||||||
|
if obj{"value", "ready"}.isNil():
|
||||||
|
let msg = "Readiness message does not follow spec"
|
||||||
|
raise newException(ProtocolException, msg)
|
||||||
|
|
||||||
|
if not obj{"value", "ready"}.getBVal():
|
||||||
|
raise newException(WebDriverException, "WebDriver is not ready")
|
||||||
|
|
||||||
|
# Create our session.
|
||||||
|
let sessionReq = %*{"capabilities": {"browserName": "firefox"}}
|
||||||
|
let sessionResp = self.client.postContent($(self.url / "session"),
|
||||||
|
$sessionReq)
|
||||||
|
let sessionObj = parseJson(sessionResp)
|
||||||
|
if sessionObj{"value", "sessionId"}.isNil():
|
||||||
|
raise newException(ProtocolException, "No sessionId in response to request")
|
||||||
|
|
||||||
|
return Session(id: sessionObj["value"]["sessionId"].getStr(), driver: self)
|
||||||
|
|
||||||
|
proc navigate*(self: Session, url: string) =
|
||||||
|
let reqUrl = $(self.driver.url / "session" / self.id / "url")
|
||||||
|
let obj = %*{"url": url}
|
||||||
|
let resp = self.driver.client.postContent(reqUrl, $obj)
|
||||||
|
|
||||||
|
let respObj = parseJson(resp)
|
||||||
|
if respObj{"value"}.getFields().len != 0:
|
||||||
|
raise newException(WebDriverException, $respObj)
|
||||||
|
|
||||||
|
proc getPageSource*(self: Session): string =
|
||||||
|
let reqUrl = $(self.driver.url / "session" / self.id / "source")
|
||||||
|
let resp = self.driver.client.getContent(reqUrl)
|
||||||
|
|
||||||
|
let respObj = parseJson(resp)
|
||||||
|
if respObj{"value"}.isNil:
|
||||||
|
raise newException(WebDriverException, $respObj)
|
||||||
|
|
||||||
|
return respObj{"value"}.getStr()
|
||||||
|
|
||||||
|
when isMainModule:
|
||||||
|
let webDriver = newWebDriver()
|
||||||
|
let session = webDriver.createSession()
|
||||||
|
echo(session)
|
||||||
|
session.navigate("https://picheta.me")
|
||||||
|
echo(session.getPageSource())
|
||||||
13
webdriver.nimble
Normal file
13
webdriver.nimble
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
# Package
|
||||||
|
|
||||||
|
version = "0.1.0"
|
||||||
|
author = "Dominik Picheta"
|
||||||
|
description = "Implementation of the WebDriver w3c spec."
|
||||||
|
license = "MIT"
|
||||||
|
|
||||||
|
srcDir = "src"
|
||||||
|
|
||||||
|
# Dependencies
|
||||||
|
|
||||||
|
requires "nim >= 0.17.2"
|
||||||
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue