Implemented element finding using various strategies.

This commit is contained in:
Dominik Picheta 2017-10-15 13:45:59 +01:00
commit e9b9b74dc7

View file

@ -9,14 +9,32 @@ type
driver: WebDriver driver: WebDriver
id*: string id*: string
Element* = object
session: Session
id*: string
LocationStrategy* = enum
CssSelector, LinkTextSelector, PartialLinkTextSelector, TagNameSelector,
XPathSelector
WebDriverException* = object of Exception WebDriverException* = object of Exception
ProtocolException* = object of WebDriverException ProtocolException* = object of WebDriverException
proc toKeyword(strategy: LocationStrategy): string =
case strategy
of CssSelector: "css selector"
of LinkTextSelector: "link text"
of PartialLinkTextSelector: "partial link text"
of TagNameSelector: "tag name"
of XPathSelector: "xpath"
proc newWebDriver*(url: string = "http://localhost:4444"): WebDriver = proc newWebDriver*(url: string = "http://localhost:4444"): WebDriver =
WebDriver(url: url.parseUri, client: newHttpClient()) WebDriver(url: url.parseUri, client: newHttpClient())
proc createSession*(self: WebDriver): Session = proc createSession*(self: WebDriver): Session =
## Creates a new browsing session.
# Check the readiness of the Web Driver. # Check the readiness of the Web Driver.
let resp = self.client.getContent($(self.url / "status")) let resp = self.client.getContent($(self.url / "status"))
let obj = parseJson(resp) let obj = parseJson(resp)
@ -39,6 +57,7 @@ proc createSession*(self: WebDriver): Session =
return Session(id: sessionObj["value"]["sessionId"].getStr(), driver: self) return Session(id: sessionObj["value"]["sessionId"].getStr(), driver: self)
proc navigate*(self: Session, url: string) = proc navigate*(self: Session, url: string) =
## Instructs the session to navigate to the specified URL.
let reqUrl = $(self.driver.url / "session" / self.id / "url") let reqUrl = $(self.driver.url / "session" / self.id / "url")
let obj = %*{"url": url} let obj = %*{"url": url}
let resp = self.driver.client.postContent(reqUrl, $obj) let resp = self.driver.client.postContent(reqUrl, $obj)
@ -48,6 +67,7 @@ proc navigate*(self: Session, url: string) =
raise newException(WebDriverException, $respObj) raise newException(WebDriverException, $respObj)
proc getPageSource*(self: Session): string = proc getPageSource*(self: Session): string =
## Retrieves the specified session's page source.
let reqUrl = $(self.driver.url / "session" / self.id / "source") let reqUrl = $(self.driver.url / "session" / self.id / "source")
let resp = self.driver.client.getContent(reqUrl) let resp = self.driver.client.getContent(reqUrl)
@ -57,9 +77,34 @@ proc getPageSource*(self: Session): string =
return respObj{"value"}.getStr() return respObj{"value"}.getStr()
proc findElement*(self: Session, selector: string,
strategy = CssSelector): Element =
let reqUrl = $(self.driver.url / "session" / self.id / "element")
let reqObj = %*{"using": toKeyword(strategy), "value": selector}
let resp = self.driver.client.postContent(reqUrl, $reqObj)
let respObj = parseJson(resp)
if respObj{"value"}.isNil:
raise newException(WebDriverException, $respObj)
for key, value in respObj["value"].getFields().pairs():
return Element(id: value.getStr(), session: self)
proc getText*(self: Element): string =
let reqUrl = $(self.session.driver.url / "session" / self.session.id /
"element" / self.id / "text")
let resp = self.session.driver.client.getContent(reqUrl)
let respObj = parseJson(resp)
if respObj{"value"}.isNil:
raise newException(WebDriverException, $respObj)
return respObj["value"].getStr()
when isMainModule: when isMainModule:
let webDriver = newWebDriver() let webDriver = newWebDriver()
let session = webDriver.createSession() let session = webDriver.createSession()
echo(session) let amazonUrl = "https://www.amazon.co.uk/Nintendo-Classic-Mini-" &
session.navigate("https://picheta.me") "Entertainment-System/dp/B073BVHY3F"
echo(session.getPageSource()) session.navigate(amazonUrl)
echo session.findElement("#priceblock_ourprice").getText()