rutl 0.5.0 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1f2590f32dfe005e1508e0e88f3faa3a840173da6bf67313f0e951642c13e611
4
- data.tar.gz: 500cbd32f70149497bd3a1decdccb21678f2e516d3b97e96aeaa4a2d5abfc72b
3
+ metadata.gz: 21fa6d406b33dee3134e1cf6da770e4f51434664d55d109b19858290ec5f0776
4
+ data.tar.gz: ab14d6f097caa9bbdc888ca8409c711fed65da87129bbcb03f96fa265aa5df34
5
5
  SHA512:
6
- metadata.gz: f312505641be60572b85da6fbe890a49be75af82f5c61c5f484b39e11596706f3c3b04c699a3759da8774227d1f86c1c18502ed8d765fe389a04c9c7c7a88505
7
- data.tar.gz: f0dd36b84da17dc6a4db7d61ae973f024a8f940ef408a27be3d79422e5a11a7989b178ce549bc6a3e4052fc5fd1971c93522c0ebb6479776fa75b8e8644ad19e
6
+ metadata.gz: 5c81506c59bc5224d50928351455241d83123cfb7d2ff3a8383b0aad7e0914ede6f20128e5dbe34d87743c0575ac33972b517a2506f51292a32dad64b29abc03
7
+ data.tar.gz: 2e99c3d93ae8cd9af232ffc26d214866f649cd2d295a553818e835e6e7b0ee3abd4f805741fefbfd85a910251451358309435fe3c6bd4bdc4419868cc667203c
@@ -40,7 +40,7 @@ Style/BracesAroundHashParameters:
40
40
  # And BasePage does @@loaded_pages.
41
41
  Style/ClassVars:
42
42
  Exclude:
43
- - 'lib/rutl/driver/null_driver_page_element.rb'
43
+ - 'lib/rutl/null_driver/null_element.rb'
44
44
  - 'lib/rutl/base_page.rb'
45
45
 
46
46
  # Rubocop flags lots of things as useless assignment when they're actually
@@ -1,6 +1,6 @@
1
1
  # This configuration was generated by
2
2
  # `rubocop --auto-gen-config`
3
- # on 2018-06-07 12:55:41 -0700 using RuboCop version 0.56.0.
3
+ # on 2018-06-07 20:55:18 -0700 using RuboCop version 0.56.0.
4
4
  # The point is for the user to remove these configuration records
5
5
  # one by one as the offenses are removed from the code base.
6
6
  # Note that changes in the inspected code, or installation of new
@@ -11,19 +11,26 @@
11
11
  Metrics/MethodLength:
12
12
  Max: 11
13
13
 
14
+ # Offense count: 2
15
+ Style/ClassVars:
16
+ Exclude:
17
+ - 'lib/rutl/driver/null_driver_page_element.rb'
18
+ - 'lib/rutl/base_page.rb'
19
+ - 'lib/rutl/null_driver/null_element.rb'
20
+
14
21
  # Offense count: 4
15
22
  # Configuration parameters: AllowedVariables.
16
23
  Style/GlobalVars:
17
24
  Exclude:
18
25
  - 'lib/rutl/browser.rb'
19
- - 'lib/rutl/interface/elements/element.rb'
20
- - 'lib/rutl/interface/elements/element_context.rb'
21
- - 'lib/rutl/interface/null_interface.rb'
26
+ - 'lib/rutl/element/element.rb'
27
+ - 'lib/rutl/element/element_context.rb'
28
+ - 'lib/rutl/interface/null.rb'
22
29
 
23
30
  # Offense count: 4
24
31
  Style/MethodMissingSuper:
25
32
  Exclude:
26
33
  - 'lib/rutl/browser.rb'
27
- - 'lib/rutl/interface/base_interface.rb'
28
- - 'lib/rutl/interface/elements/element.rb'
34
+ - 'lib/rutl/element/element.rb'
35
+ - 'lib/rutl/interface/base.rb'
29
36
  - 'lib/rutl/page.rb'
@@ -38,8 +38,8 @@ module RUTL
38
38
  private
39
39
 
40
40
  def load_interface(type)
41
- require "rutl/interface/#{type}_interface"
42
- klass = "RUTL::#{type.to_s.capitalize}Interface"
41
+ require "rutl/interface/#{type}"
42
+ klass = "RUTL::Interface::#{type.to_s.capitalize}"
43
43
  Object.const_get(klass).new
44
44
  end
45
45
 
@@ -20,7 +20,7 @@ module RUTL
20
20
  @counter = 0
21
21
  @driver = driver
22
22
  return if guard
23
- @base_name = base_name.sub('RUTL::', '')
23
+ @base_name = base_name.sub('::', '')
24
24
  @dir = File.join(RUTL::SCREENSHOTS, @base_name)
25
25
  FileUtils.mkdir_p @dir
26
26
  end
@@ -13,8 +13,8 @@ module RUTL
13
13
  # passed in isn't the same as the browser's interface.
14
14
  # This only happens with click test cases, before the click, and
15
15
  # only if that case isn't run first.
16
- # The context we're passed is also an instance from as ChromeInterface,
17
- # but a different instance.
16
+ # The context we're passed is also an instance from as
17
+ # RUTL::Interface::Chrome, but a different instance.
18
18
  #
19
19
  # Here's the kludge workaround line:
20
20
  @context.interface = $browser.interface
@@ -1,38 +1,40 @@
1
1
  module RUTL
2
2
  module Element
3
- #
4
- # The context passed around to all elements.
5
- # What they need to know outside of themselves to function.
6
- #
7
- class ElementContext
8
- # Nil. Or an Array. One would hope an Array of states. But I'm not checking.
9
- attr_accessor :destinations
10
- # Nil. Or a RUTL::BaseInterface.
11
- attr_accessor :interface
12
- # An Arrray, maybe empty and maybe an array of selectors.
13
- # TODO: This should be a hash.
14
- attr_accessor :selectors
3
+ #
4
+ # The context passed around to all elements.
5
+ # What they need to know outside of themselves to function.
6
+ #
7
+ class ElementContext
8
+ # Nil. Or an Array. One would hope an Array of states.
9
+ # But I'm not checking.
10
+ attr_accessor :destinations
11
+ # Nil. Or a RUTL::Interface::Base.
12
+ attr_accessor :interface
13
+ # An Arrray, maybe empty and maybe an array of selectors.
14
+ # TODO: This should be a hash.
15
+ attr_accessor :selectors
15
16
 
16
- def initialize(destinations: nil, interface: nil, selectors: [])
17
- unless destinations.nil? || destinations.class == Array
18
- # Should check each destination to make sure it's a
19
- # Page or a _____, too.
20
- raise 'destination must be an Array of destinations or nil.'
17
+ def initialize(destinations: nil, interface: nil, selectors: [])
18
+ unless destinations.nil? || destinations.class == Array
19
+ # Should check each destination to make sure it's a
20
+ # Page or a _____, too.
21
+ raise 'destination must be an Array of destinations or nil.'
22
+ end
23
+ @destinations = destinations || []
24
+ unless interface.nil? || interface.is_a?(RUTL::Interface::Base)
25
+ raise "#{interface.class}: #{interface} " \
26
+ 'must be an Interface::* class.'
27
+ end
28
+ @interface = interface
29
+ @selectors = selectors
21
30
  end
22
- @destinations = destinations || []
23
- unless interface.nil? || interface.is_a?(RUTL::BaseInterface)
24
- raise "#{interface.class}: #{interface} must be a *Interface class."
25
- end
26
- @interface = interface
27
- @selectors = selectors
28
- end
29
31
 
30
- def find_element(type)
31
- # @interface.driver.find_element(type, @selectors[type])
32
- # Should be this, but apparently @interface.driver is being overwritten
33
- # (or not written to) and it doesn't work. Using $browser does. :-(
34
- $browser.interface.driver.find_element(type, @selectors[type])
32
+ def find_element(type)
33
+ # @interface.driver.find_element(type, @selectors[type])
34
+ # Should be this, but apparently @interface.driver is being overwritten
35
+ # (or not written to) and it doesn't work. Using $browser does. :-(
36
+ $browser.interface.driver.find_element(type, @selectors[type])
37
+ end
35
38
  end
36
39
  end
37
40
  end
38
- end
@@ -0,0 +1,93 @@
1
+ require 'utilities'
2
+ require 'rutl/camera'
3
+
4
+ module RUTL
5
+ module Interface
6
+ #
7
+ # I might need to consider renaming these.
8
+ # The *interface classes lie between Browser
9
+ # and the webdriver-level classes.
10
+ #
11
+ class Base
12
+ include Utilities
13
+
14
+ # RUTL::Driver
15
+ attr_accessor :driver
16
+
17
+ # RUTL::Camera
18
+ attr_accessor :camera
19
+
20
+ # Array of all RUTL::Page classes
21
+ attr_accessor :pages
22
+
23
+ def initialize
24
+ raise 'Child interface class must set @driver.' if @driver.nil?
25
+ # base_name avoids collisions when unning the same tests with
26
+ # different browsers.
27
+ name = self.class.to_s.sub('RUTL::Interface', '')
28
+ @camera = Camera.new(@driver, base_name: name)
29
+ end
30
+
31
+ # Attempts to navigate to the page.
32
+ # Takes screenshot if successful.
33
+ def goto(page)
34
+ raise 'expect Page class' unless page?(page)
35
+ find_page(page).go_to_here
36
+ @camera.screenshot
37
+ end
38
+
39
+ # Should define in children; raises here.
40
+ # Should return the current page class.
41
+ def current_page
42
+ raise 'define in child classes'
43
+ end
44
+
45
+ def method_missing(method, *args, &block)
46
+ if args.empty?
47
+ current_page.send(method)
48
+ else
49
+ current_page.send(method, *args, &block)
50
+ end
51
+ end
52
+
53
+ # TODO: Is this needed? I not only find the page but also make sure the
54
+ # urls match. Even though that's what finding pages means?
55
+ def find_state(target_states)
56
+ target_states.each do |state|
57
+ next unless state.url == current_page.url
58
+ page = find_page(state)
59
+ return page if page.loaded?
60
+ end
61
+ false
62
+ end
63
+
64
+ # Attempts to find page by class or url.
65
+ def find_page(page)
66
+ @pages.each do |p|
67
+ return p if page?(page) && p.class == page
68
+ return p if String == page.class && page == p.url
69
+ end
70
+ raise "Page \"#{page}\" not found in pages #{@pages}"
71
+ end
72
+
73
+ # Calls the polling utility mathod await() with a lambda trying to
74
+ # find the next state, probably a Page class.
75
+ def wait_for_transition(target_states)
76
+ #
77
+ # TODO: Should also see if there are other things to wait for.
78
+ # I don't think this is doing page load time.
79
+ #
80
+ await -> { find_state target_states }
81
+ end
82
+
83
+ def respond_to_missing?(*args)
84
+ # This can't be right. Figure it out later.
85
+ current_page.respond_to?(*args)
86
+ end
87
+
88
+ def quit
89
+ @driver.quit
90
+ end
91
+ end
92
+ end
93
+ end
@@ -0,0 +1,36 @@
1
+ require 'selenium-webdriver'
2
+ require 'rutl/interface/base'
3
+
4
+ module RUTL
5
+ module Interface
6
+ #
7
+ # Small interface for Chrome browser.
8
+ #
9
+ class Chrome < Base
10
+ # rubocop:disable Metrics/MethodLength
11
+ def initialize
12
+ @logged_in = true
13
+ options = Selenium::WebDriver::Chrome::Options.new
14
+ options.add_argument('--ignore-certificate-errors')
15
+ options.add_argument('--disable-popup-blocking')
16
+ options.add_argument('--disable-translate')
17
+ # Run headless on TravisCI
18
+ if ENV['TRAVIS'] == 'true'
19
+ options.add_argument('--disable-gpu')
20
+ options.add_argument('--headless ')
21
+ options.add_argument('--no-sandbox')
22
+ end
23
+ @driver = Selenium::WebDriver.for :chrome, options: options
24
+ super
25
+ end
26
+ # rubocop:enable Metrics/MethodLength
27
+
28
+ def current_page
29
+ url = @driver.current_url
30
+ page = find_page(url)
31
+ raise "PAGE NOT FOUND: #{url}, PAGES: #{@pages}" unless page
32
+ page
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,29 @@
1
+ require 'selenium-webdriver'
2
+ require 'rutl/interface/base'
3
+
4
+ module RUTL
5
+ module Interface
6
+ #
7
+ # Small interface for Chrome browser.
8
+ #
9
+ class Firefox < Base
10
+ def initialize
11
+ @logged_in = true
12
+ options = Selenium::WebDriver::Firefox::Options.new
13
+ options.add_argument('--ignore-certificate-errors')
14
+ options.add_argument('--disable-popup-blocking')
15
+ options.add_argument('--disable-translate')
16
+ options.add_argument('--headless') if ENV['TRAVIS'] == 'true'
17
+ @driver = Selenium::WebDriver.for :firefox, options: options
18
+ super
19
+ end
20
+
21
+ def current_page
22
+ url = @driver.current_url
23
+ page = find_page(url)
24
+ raise "PAGE NOT FOUND: #{url}, PAGES: #{@pages}" unless page
25
+ page
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,35 @@
1
+ require 'rutl/interface/base'
2
+
3
+ module RUTL
4
+ module Interface
5
+ #
6
+ # Interface-level code for fake browser.
7
+ #
8
+ class Null < Base
9
+ def initialize
10
+ context = RUTL::Element::ElementContext.new(destinations: nil,
11
+ interface: self,
12
+ selectors: [])
13
+ @driver = NullDriver.new(context)
14
+ super
15
+ end
16
+
17
+ # The null driver needs to talk to the null interface.
18
+ # Other driver/interface relations are not like this.
19
+ attr_writer :current_page
20
+
21
+ def current_page
22
+ # Default to @pages.first if not set?
23
+ # A browser can always check its current URL but the null driver can't.
24
+ @current_page ||= @pages.first
25
+ end
26
+
27
+ def wait_for_transition(destinations)
28
+ # TODO: Setting @current page didn't do it beacause that set
29
+ # context.interface.current_page and we wanted this in the browser.
30
+ @current_page = destinations.first.new(self)
31
+ $browser.current_page = @current_page
32
+ end
33
+ end
34
+ end
35
+ end
@@ -49,8 +49,7 @@ module RUTL
49
49
  # Placeholder - NOP
50
50
  # Called by RUTL::Element::ClickToChangeStateMixin like
51
51
  # Selenium driver.click
52
- def click
53
- end
52
+ def click; end
54
53
  end
55
54
  end
56
55
  end
@@ -84,8 +84,8 @@ module RUTL
84
84
  def method_missing(element, *args, &_block)
85
85
  name, selectors, rest = args
86
86
  context = RUTL::Element::ElementContext.new(destinations: rest,
87
- interface: @interface,
88
- selectors: selectors)
87
+ interface: @interface,
88
+ selectors: selectors)
89
89
  case element
90
90
  when /button/, /checkbox/, /element/, /link/
91
91
  add_method(name: name, context: context, klass: element)
@@ -1,3 +1,3 @@
1
1
  module RUTL
2
- VERSION = '0.5.0'.freeze
2
+ VERSION = '0.6.0'.freeze
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rutl
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Drew Cooper
@@ -198,10 +198,10 @@ files:
198
198
  - lib/rutl/element/link.rb
199
199
  - lib/rutl/element/string_reader_writer_mixin.rb
200
200
  - lib/rutl/element/text.rb
201
- - lib/rutl/interface/base_interface.rb
202
- - lib/rutl/interface/chrome_interface.rb
203
- - lib/rutl/interface/firefox_interface.rb
204
- - lib/rutl/interface/null_interface.rb
201
+ - lib/rutl/interface/base.rb
202
+ - lib/rutl/interface/chrome.rb
203
+ - lib/rutl/interface/firefox.rb
204
+ - lib/rutl/interface/null.rb
205
205
  - lib/rutl/null_driver/null_driver.rb
206
206
  - lib/rutl/null_driver/null_element.rb
207
207
  - lib/rutl/page.rb
@@ -1,90 +0,0 @@
1
- require 'utilities'
2
- require 'rutl/camera'
3
-
4
- module RUTL
5
- #
6
- # I might need to consider renaming these.
7
- # The *interface classes lie between Browser and the webdriver-level classes.
8
- #
9
- class BaseInterface
10
- include Utilities
11
-
12
- # RUTL::Driver
13
- attr_accessor :driver
14
-
15
- # RUTL::Camera
16
- attr_accessor :camera
17
-
18
- # Array of all RUTL::Page classes
19
- attr_accessor :pages
20
-
21
- def initialize
22
- raise 'Child interface class must set @driver.' if @driver.nil?
23
- # base_name avoids collisions when unning the same tests with
24
- # different browsers.
25
- name = self.class.to_s.sub('RUTL::Interface', '')
26
- @camera = Camera.new(@driver, base_name: name)
27
- end
28
-
29
- # Attempts to navigate to the page.
30
- # Takes screenshot if successful.
31
- def goto(page)
32
- raise 'expect Page class' unless page?(page)
33
- find_page(page).go_to_here
34
- @camera.screenshot
35
- end
36
-
37
- # Should define in children; raises here.
38
- # Should return the current page class.
39
- def current_page
40
- raise 'define in child classes'
41
- end
42
-
43
- def method_missing(method, *args, &block)
44
- if args.empty?
45
- current_page.send(method)
46
- else
47
- current_page.send(method, *args, &block)
48
- end
49
- end
50
-
51
- # TODO: Is this needed? I not only find the page but also make sure the
52
- # urls match. Even though that's what finding pages means?
53
- def find_state(target_states)
54
- target_states.each do |state|
55
- next unless state.url == current_page.url
56
- page = find_page(state)
57
- return page if page.loaded?
58
- end
59
- false
60
- end
61
-
62
- # Attempts to find page by class or url.
63
- def find_page(page)
64
- @pages.each do |p|
65
- return p if page?(page) && p.class == page
66
- return p if String == page.class && page == p.url
67
- end
68
- raise "Page \"#{page}\" not found in pages #{@pages}"
69
- end
70
-
71
- # Calls the polling utility mathod await() with a lambda trying to
72
- # find the next state, probably a Page class.
73
- def wait_for_transition(target_states)
74
- #
75
- # TODO: Should also see if there are other things to wait for.
76
- # I don't think this is doing page load time.
77
- #
78
- await -> { find_state target_states }
79
- end
80
-
81
- def respond_to_missing?(*args)
82
- # This can't be right. Figure it out later.
83
- current_page.respond_to?(*args)
84
- end
85
-
86
- def quit
87
- @driver.quit
88
- end
89
- end
90
- end
@@ -1,34 +0,0 @@
1
- require 'selenium-webdriver'
2
- require 'rutl/interface/base_interface'
3
-
4
- module RUTL
5
- #
6
- # Small interface for Chrome browser.
7
- #
8
- class ChromeInterface < BaseInterface
9
- # rubocop:disable Metrics/MethodLength
10
- def initialize
11
- @logged_in = true
12
- options = Selenium::WebDriver::Chrome::Options.new
13
- options.add_argument('--ignore-certificate-errors')
14
- options.add_argument('--disable-popup-blocking')
15
- options.add_argument('--disable-translate')
16
- # Run headless on TravisCI
17
- if ENV['TRAVIS'] == 'true'
18
- options.add_argument('--disable-gpu')
19
- options.add_argument('--headless ')
20
- options.add_argument('--no-sandbox')
21
- end
22
- @driver = Selenium::WebDriver.for :chrome, options: options
23
- super
24
- end
25
- # rubocop:enable Metrics/MethodLength
26
-
27
- def current_page
28
- url = @driver.current_url
29
- page = find_page(url)
30
- raise "PAGE NOT FOUND: #{url}, PAGES: #{@pages}" unless page
31
- page
32
- end
33
- end
34
- end
@@ -1,27 +0,0 @@
1
- require 'selenium-webdriver'
2
- require 'rutl/interface/base_interface'
3
-
4
- module RUTL
5
- #
6
- # Small interface for Chrome browser.
7
- #
8
- class FirefoxInterface < BaseInterface
9
- def initialize
10
- @logged_in = true
11
- options = Selenium::WebDriver::Firefox::Options.new
12
- options.add_argument('--ignore-certificate-errors')
13
- options.add_argument('--disable-popup-blocking')
14
- options.add_argument('--disable-translate')
15
- options.add_argument('--headless') if ENV['TRAVIS'] == 'true'
16
- @driver = Selenium::WebDriver.for :firefox, options: options
17
- super
18
- end
19
-
20
- def current_page
21
- url = @driver.current_url
22
- page = find_page(url)
23
- raise "PAGE NOT FOUND: #{url}, PAGES: #{@pages}" unless page
24
- page
25
- end
26
- end
27
- end
@@ -1,33 +0,0 @@
1
- require 'rutl/interface/base_interface'
2
-
3
- module RUTL
4
- #
5
- # Interface-level code for fake browser.
6
- #
7
- class NullInterface < BaseInterface
8
- def initialize
9
- context = RUTL::Element::ElementContext.new(destinations: nil,
10
- interface: self,
11
- selectors: [])
12
- @driver = NullDriver.new(context)
13
- super
14
- end
15
-
16
- # The null driver needs to talk to the null interface.
17
- # Other driver/interface relations are not like this.
18
- attr_writer :current_page
19
-
20
- def current_page
21
- # Default to @pages.first if not set?
22
- # A browser can always check its current URL but the null driver can't.
23
- @current_page ||= @pages.first
24
- end
25
-
26
- def wait_for_transition(destinations)
27
- # TODO: Setting @current page didn't do it beacause that set
28
- # context.interface.current_page and we wanted this in the browser.
29
- @current_page = destinations.first.new(self)
30
- $browser.current_page = @current_page
31
- end
32
- end
33
- end