diff --git a/src/BaselineOfWebDriver/BaselineOfWebDriver.class.st b/src/BaselineOfWebDriver/BaselineOfWebDriver.class.st index 2bc1605..d491aac 100644 --- a/src/BaselineOfWebDriver/BaselineOfWebDriver.class.st +++ b/src/BaselineOfWebDriver/BaselineOfWebDriver.class.st @@ -13,7 +13,8 @@ BaselineOfWebDriver >> baseline: spec [ spec package: 'WebDriver' ]; - baseline: 'NeoJSON' with: [ spec repository: 'github://svenvc/NeoJSON/repository' ] + baseline: 'NeoJSON' with: [ spec repository: 'github://svenvc/NeoJSON/repository' ]; + baseline: 'OSSubprocess' with: [ spec repository: 'github://pharo-contributions/OSSubprocess:master/repository' ] ] { #category : #accessing } diff --git a/src/WebDriver-Tests/WebDriverTest.class.st b/src/WebDriver-Tests/WebDriverTest.class.st new file mode 100644 index 0000000..80ab6b2 --- /dev/null +++ b/src/WebDriver-Tests/WebDriverTest.class.st @@ -0,0 +1,53 @@ +" +A WebDriverTest is a test class for testing the behavior of WebDriver +" +Class { + #name : #WebDriverTest, + #superclass : #TestCase, + #instVars : [ + 'webdriver' + ], + #category : #'WebDriver-Tests' +} + +{ #category : #initialization } +WebDriverTest >> setUp [ + super setUp. + webdriver := WebDriver geckodriver. + webdriver session. +] + +{ #category : #running } +WebDriverTest >> tearDown [ + webdriver deleteSession. + super tearDown. +] + +{ #category : #tests } +WebDriverTest >> testFindElementInvalidCSSSelector [ + self + should: [ webdriver url: 'https://ddg.co'; findElement: '' using: WDLocationStrategy cssSelector ] + raise: WDInvalidSelector. +] + +{ #category : #tests } +WebDriverTest >> testFindElementValid [ + | result | + result := webdriver url: 'https://ddg.co'; findElement: '.logo_homepage' using: WDLocationStrategy cssSelector. + self assert: (result isString). +] + +{ #category : #tests } +WebDriverTest >> testFindElementsInvalidCSSSelector [ + self + should: [ webdriver url: 'https://ddg.co'; findElements: '' using: WDLocationStrategy cssSelector ] + raise: WDInvalidSelector. +] + +{ #category : #tests } +WebDriverTest >> testFindElementsValid [ + | result | + result := webdriver url: 'https://ddg.co'; + findElements: '.badge-link__bullet' using: WDLocationStrategy cssSelector. + self assert: result size equals: 3. +] diff --git a/src/WebDriver-Tests/package.st b/src/WebDriver-Tests/package.st new file mode 100644 index 0000000..ec0cf5e --- /dev/null +++ b/src/WebDriver-Tests/package.st @@ -0,0 +1 @@ +Package { #name : #'WebDriver-Tests' } diff --git a/src/WebDriver/WDInvalidSelector.class.st b/src/WebDriver/WDInvalidSelector.class.st new file mode 100644 index 0000000..b4a762b --- /dev/null +++ b/src/WebDriver/WDInvalidSelector.class.st @@ -0,0 +1,5 @@ +Class { + #name : #WDInvalidSelector, + #superclass : #Exception, + #category : #WebDriver +} diff --git a/src/WebDriver/WebDriver.class.st b/src/WebDriver/WebDriver.class.st index cc2c372..2501731 100644 --- a/src/WebDriver/WebDriver.class.st +++ b/src/WebDriver/WebDriver.class.st @@ -11,28 +11,67 @@ Class { #category : #WebDriver } -{ #category : #positioning } +{ #category : #'instance creation' } +WebDriver class >> geckodriver [ + | subproc | + subproc := OSSUnixSubprocess new + command: 'geckodriver'. + [ subproc run ] fork. + ^ self new + browser: subproc + server: '127.0.0.1' + port: 4444. +] + +{ #category : #navigation } WebDriver >> back [ self send: { } to: 'session/',sessionId,'/back' using: #POST. ] -{ #category : #'as yet unclassified' } +{ #category : #initialization } +WebDriver >> browser: brs server: srv port: portnum [ + browser := brs. + server := srv. + port := portnum. +] + +{ #category : #finalization } WebDriver >> deleteSession [ "Deletes the session." self send: {} to: 'session/',sessionId using: #DELETE. ] -{ #category : #'as yet unclassified' } +{ #category : #finalization } +WebDriver >> finalize [ + browser terminate. + super finalize. +] + +{ #category : #accessing } WebDriver >> findElement: elemSelector using: locStrategy [ - ^(self send: { #using -> locStrategy. #value -> elemSelector. } to: 'session/',sessionId,'/element' using: #POST) at: #value values first. + | reply | + reply := (self send: { #using -> locStrategy. #value -> elemSelector. } + to: 'session/',sessionId,'/element' + using: #POST) + at: #value. + (reply at: #error ifPresent: [ true ] ifAbsent: [ false ]) + ifTrue: [ ^ WDInvalidSelector new signal: (reply at: #message) ] + ifFalse: [ ^ reply values first ] ] -{ #category : #'as yet unclassified' } +{ #category : #accessing } WebDriver >> findElements: elemSelector using: locStrategy [ - ^(self send: { #using -> locStrategy. #value -> elemSelector. } to: 'session/',sessionId,'/elements' using: #POST) at: #value values. + | reply | + reply := (self send: { #using -> locStrategy. #value -> elemSelector. } + to: 'session/',sessionId,'/elements' + using: #POST) + at: #value. + (reply isArray) + ifTrue: [ ^ reply collect: [ :elem | elem values first ] ] + ifFalse: [ ^ WDInvalidSelector new signal: (reply at: #message) ] ] -{ #category : #positioning } +{ #category : #navigation } WebDriver >> forward [ self send: { } to: 'session/',sessionId,'/forward' using: #POST. ] @@ -43,12 +82,12 @@ WebDriver >> initialize: srv port: portnum [ port := portnum. ] -{ #category : #positioning } +{ #category : #navigation } WebDriver >> refresh [ self send: { } to: 'session/',sessionId,'/refresh' using: #POST. ] -{ #category : #'as yet unclassified' } +{ #category : #navigation } WebDriver >> send: dict to: url using: method [ |result| result := nil. @@ -66,12 +105,6 @@ WebDriver >> send: dict to: url using: method [ ^result. ] -{ #category : #initialization } -WebDriver >> server: srv port: portnum [ - server := srv. - port := portnum. -] - { #category : #accessing } WebDriver >> session [ "Initializes a new WebDriver session." @@ -84,18 +117,18 @@ WebDriver >> status [ ^ (self send: { } to: 'status' using: #GET) at: #value. ] -{ #category : #positioning } +{ #category : #accessing } WebDriver >> title [ ^ (self send: { } to: 'session/',sessionId,'/title' using: #GET) at: #value. ] -{ #category : #'as yet unclassified' } +{ #category : #'text input' } WebDriver >> type: text into: element [ self send: { #text -> text } to: 'session/',sessionId,'/element/',element,'/value' using: #POST. ] -{ #category : #accessing } +{ #category : #navigation } WebDriver >> url: url [ "Navigates the browser to the given URL." self send: { #url -> url } to: 'session/',sessionId,'/url' using: #POST.