gxt-widgets 0.1 → 0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/.travis.yml +1 -1
- data/features/gxt_basic_tree.feature +56 -0
- data/features/gxt_grid.feature +16 -16
- data/features/gxt_grid_with_grouping.feature +37 -15
- data/features/step_definitions/gxt_grid_steps.rb +5 -5
- data/features/step_definitions/gxt_grid_with_grouping_steps.rb +58 -0
- data/features/step_definitions/gxt_tree_steps.rb +46 -0
- data/features/support/pages/basic_tree_example.rb +9 -0
- data/features/support/pages/grouping_grid_example.rb +3 -0
- data/features/support/pages/gxt_examples_page.rb +2 -0
- data/gxt-widget.gemspec +1 -1
- data/lib/gxt-widgets.rb +4 -0
- data/lib/gxt-widgets/gxt_basic_tree.rb +56 -0
- data/lib/gxt-widgets/gxt_grid.rb +2 -10
- data/lib/gxt-widgets/gxt_grid_group.rb +44 -0
- data/lib/gxt-widgets/gxt_grid_row.rb +3 -0
- data/lib/gxt-widgets/gxt_group_column_menu.rb +8 -0
- data/lib/gxt-widgets/gxt_grouping_grid.rb +53 -0
- data/lib/gxt-widgets/modules/groupable_column.rb +12 -0
- data/lib/gxt-widgets/platforms/selenium_webdriver/gxt_grid.rb +2 -8
- data/lib/gxt-widgets/platforms/selenium_webdriver/gxt_grouping_grid.rb +18 -0
- data/lib/gxt-widgets/platforms/selenium_webdriver/row_container.rb +22 -0
- data/lib/gxt-widgets/platforms/watir_webdriver/gxt_grid.rb +2 -19
- data/lib/gxt-widgets/platforms/watir_webdriver/gxt_grouping_grid.rb +16 -0
- data/lib/gxt-widgets/platforms/watir_webdriver/row_container.rb +31 -0
- data/lib/gxt-widgets/row_container.rb +28 -0
- data/lib/gxt-widgets/version.rb +1 -1
- data/spec/gxt-widgets/gxt_grid_row_spec.rb +1 -1
- metadata +21 -11
data/.travis.yml
CHANGED
@@ -0,0 +1,56 @@
|
|
1
|
+
Feature: Gxt Basic Tree
|
2
|
+
In order to interact with trees
|
3
|
+
Testers need to be able to search and navigate trees
|
4
|
+
|
5
|
+
Background:
|
6
|
+
Given I am on the Gxt Examples page
|
7
|
+
And I have the Basic Tree opened
|
8
|
+
|
9
|
+
Scenario: Retrieve a tree
|
10
|
+
When I retrieve a GxtTree widget
|
11
|
+
Then I should know it is visible
|
12
|
+
|
13
|
+
@watir_only
|
14
|
+
Scenario: Determine if a tree exists
|
15
|
+
When I retrieve a GxtTree widget
|
16
|
+
Then I should know it exists
|
17
|
+
|
18
|
+
Scenario: Count the number top level elements
|
19
|
+
When I get the top level tree nodes
|
20
|
+
Then the count should be 3
|
21
|
+
|
22
|
+
Scenario: Expand the first element
|
23
|
+
When I retrieve a GxtTree widget
|
24
|
+
And I expand the "General Administration" tree node
|
25
|
+
Then The "General Manager" node should be visible
|
26
|
+
And The "Executive" node should be visible
|
27
|
+
|
28
|
+
Scenario: Expand an element to the second level
|
29
|
+
When I retrieve a GxtTree widget
|
30
|
+
And I expand the "General Administration" tree node
|
31
|
+
And I expand the "General Manager" tree node
|
32
|
+
Then The "Hollie Voss" node should be visible
|
33
|
+
|
34
|
+
Scenario: Click on the joint to expand a node
|
35
|
+
Given I retrieve a GxtTree widget
|
36
|
+
And the "Information Technology" node is collapsed
|
37
|
+
When I click on the node joint
|
38
|
+
Then the node should be expanded
|
39
|
+
|
40
|
+
Scenario: Click on the joint to collapse a node
|
41
|
+
Given I retrieve a GxtTree widget
|
42
|
+
And the "Information Technology" node is expanded
|
43
|
+
When I click on the node joint
|
44
|
+
Then the node should be collapsed
|
45
|
+
|
46
|
+
Scenario: double-click on the label to collapse a node
|
47
|
+
Given I retrieve a GxtTree widget
|
48
|
+
And the "Information Technology" node is expanded
|
49
|
+
When I double-click on the node
|
50
|
+
Then the node should be collapsed
|
51
|
+
|
52
|
+
Scenario: double-click on the label to expand a node
|
53
|
+
Given I retrieve a GxtTree widget
|
54
|
+
And the "Information Technology" node is collapsed
|
55
|
+
When I double-click on the node
|
56
|
+
Then the node should be expanded
|
data/features/gxt_grid.feature
CHANGED
@@ -8,16 +8,16 @@ Feature: Gxt Grid
|
|
8
8
|
And I have the Basic Grid opened
|
9
9
|
|
10
10
|
Scenario: Retrieve a table
|
11
|
-
When I retrieve a
|
11
|
+
When I retrieve a GxtHeaderGrid widget
|
12
12
|
Then I should know it is visible
|
13
13
|
|
14
14
|
@watir_only
|
15
15
|
Scenario: Determine if a table exists
|
16
|
-
When I retrieve a
|
16
|
+
When I retrieve a GxtHeaderGrid widget
|
17
17
|
Then I should know it exists
|
18
18
|
|
19
19
|
Scenario: Retrieve the data from a table
|
20
|
-
When I retrieve a
|
20
|
+
When I retrieve a GxtHeaderGrid widget
|
21
21
|
Then the data for row "1" should be "Hollie Voss" and "General Administration"
|
22
22
|
And the table should have "13" rows
|
23
23
|
And row "1" should have "5" columns
|
@@ -25,61 +25,61 @@ Feature: Gxt Grid
|
|
25
25
|
And the data for the last row should be "Buster misjenou" and "Accounts"
|
26
26
|
|
27
27
|
Scenario: Retrieve data from a table using a row header
|
28
|
-
When I retrieve a
|
28
|
+
When I retrieve a GxtHeaderGrid widget
|
29
29
|
Then the data for row "Gail Horton" should be "Gail Horton" and "Marketing"
|
30
30
|
|
31
31
|
Scenario: Retrieve data from a table using a partial row header
|
32
|
-
When I retrieve a
|
32
|
+
When I retrieve a GxtHeaderGrid widget
|
33
33
|
Then the data for row "Newman" should be "Dirk Newman" and "Information Technology"
|
34
34
|
|
35
35
|
Scenario: Retrieve data from a table using a row header in the 2nd column
|
36
|
-
When I retrieve a
|
36
|
+
When I retrieve a GxtHeaderGrid widget
|
37
37
|
Then the data for row "General Administration" should be "Hollie Voss" and "General Administration"
|
38
38
|
|
39
39
|
Scenario: Retrieve data from a table using a partial row header in the 2nd column
|
40
|
-
When I retrieve a
|
40
|
+
When I retrieve a GxtHeaderGrid widget
|
41
41
|
Then the data for row "Administration" should be "Hollie Voss" and "General Administration"
|
42
42
|
|
43
43
|
Scenario: Retrieve data from a table using a column header
|
44
|
-
When I retrieve a
|
44
|
+
When I retrieve a GxtHeaderGrid widget
|
45
45
|
Then the data for column "Slary" and row "2" should be "120000.00"
|
46
46
|
|
47
47
|
Scenario: Retrieve data from a table using a partial column header
|
48
|
-
When I retrieve a
|
48
|
+
When I retrieve a GxtHeaderGrid widget
|
49
49
|
Then the data for column "esignation" and row "2" should be "CTO"
|
50
50
|
|
51
51
|
Scenario: Retrieve data from a table using both headers
|
52
|
-
When I retrieve a
|
52
|
+
When I retrieve a GxtHeaderGrid widget
|
53
53
|
Then the data for row "Emerson Milton" and column "Department" should be "Information Technology"
|
54
54
|
|
55
55
|
Scenario: Retrieve data from a table with an incorrect row header
|
56
|
-
When I retrieve a
|
56
|
+
When I retrieve a GxtHeaderGrid widget
|
57
57
|
Then the data for row "Data20" should be nil
|
58
58
|
|
59
59
|
Scenario: Retrieve data from a table with an incorrect column header
|
60
|
-
When I retrieve a
|
60
|
+
When I retrieve a GxtHeaderGrid widget
|
61
61
|
Then the data for row "Chad Andrews" and column "Data20" should be nil
|
62
62
|
|
63
63
|
Scenario: Sort Ascending by Employee Name
|
64
|
-
When I retrieve a
|
64
|
+
When I retrieve a GxtHeaderGrid widget
|
65
65
|
And I open the "Employee Name" column menu
|
66
66
|
And I sort ascending
|
67
67
|
Then the data for the second row should be "Bell Snedden" and "Information Technology"
|
68
68
|
|
69
69
|
Scenario: Sort Descending by Employee Name
|
70
|
-
When I retrieve a
|
70
|
+
When I retrieve a GxtHeaderGrid widget
|
71
71
|
And I open the "Employee Name" column menu
|
72
72
|
And I sort descending
|
73
73
|
Then the data for the second row should be "Hollie Voss" and "General Administration"
|
74
74
|
|
75
75
|
Scenario: Deselect a column from the Column Menu
|
76
|
-
When I retrieve a
|
76
|
+
When I retrieve a GxtHeaderGrid widget
|
77
77
|
And I open the "Department" column menu
|
78
78
|
And I deselect the "Department" column
|
79
79
|
Then The "Department" column should not appear in the table
|
80
80
|
|
81
81
|
Scenario: Deselect then select a column from the Column Menu
|
82
|
-
Given I retrieve a
|
82
|
+
Given I retrieve a GxtHeaderGrid widget
|
83
83
|
And I open the "Department" column menu
|
84
84
|
And I deselect the "Department" column
|
85
85
|
And The "Department" column should not appear in the table
|
@@ -1,4 +1,3 @@
|
|
1
|
-
@ignore
|
2
1
|
Feature: Gxt Grid With Grouping
|
3
2
|
As a Gxt Developer
|
4
3
|
I want to control a Gxt Grid with grouping using a Widget
|
@@ -12,36 +11,59 @@ Feature: Gxt Grid With Grouping
|
|
12
11
|
Scenario: I should know the group headings and count
|
13
12
|
Then The grid should contain 4 groups
|
14
13
|
And The group headings should contain
|
15
|
-
|
|
14
|
+
|Heading|
|
15
|
+
|Department: Accounts (1 Item)|
|
16
|
+
|Department: General Administration (1 Item)|
|
17
|
+
|Department: Information Technology (7 Items)|
|
18
|
+
|Department: Marketing (3 Items)|
|
19
|
+
|
16
20
|
|
17
21
|
Scenario: I should be able to collapse a group
|
18
22
|
When The "Information Technology" Group is expanded
|
19
|
-
And I collapse the
|
23
|
+
And I collapse the group
|
20
24
|
Then The rows should not be visible
|
21
25
|
|
22
26
|
Scenario: I should be able to expand a group
|
23
27
|
When The "Information Technology" Group is collapsed
|
24
|
-
And I expand the
|
28
|
+
And I expand the group
|
25
29
|
Then the rows should be visible
|
26
30
|
|
27
31
|
Scenario: I should be able to sort (ascending) groups by the grouping column
|
28
|
-
When
|
29
|
-
And I
|
32
|
+
When I open the "Department" column menu
|
33
|
+
And I select Group By This Field
|
34
|
+
And I open the "Department" column menu
|
35
|
+
And I sort ascending
|
30
36
|
Then the group headings should contain in order
|
31
37
|
|Accounts|General Administration|Information Technology|Marketing|
|
32
38
|
|
33
39
|
Scenario: I should be able to sort (descending) groups by the grouping column
|
34
|
-
When
|
35
|
-
And I
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
40
|
+
When I open the "Department" column menu
|
41
|
+
And I select Group By This Field
|
42
|
+
And I open the "Department" column menu
|
43
|
+
And I sort descending
|
44
|
+
And The group headings should contain
|
45
|
+
|Heading|
|
46
|
+
|Department: Accounts (1 Item)|
|
47
|
+
|Department: General Administration (1 Item)|
|
48
|
+
|Department: Information Technology (7 Items)|
|
49
|
+
|Department: Marketing (3 Items)|
|
50
|
+
|
51
|
+
|
52
|
+
Scenario: I should be able to use the column menu to change the grouping field
|
53
|
+
When I open the "Department" column menu
|
54
|
+
And I select Group By This Field
|
55
|
+
When I open the "Designation" column menu
|
56
|
+
And I select Group By This Field
|
42
57
|
Then The grid should contain 7 groups
|
43
58
|
And The group headings should contain
|
44
|
-
|
|
59
|
+
|Heading|
|
60
|
+
|Designation: CTO (1 Item)|
|
61
|
+
|Designation: Executive (3 Items)|
|
62
|
+
|Designation: Executive Director (1 Item)|
|
63
|
+
|Designation: General Manager (1 Item)|
|
64
|
+
|Designation: Project Manager (1 Item)|
|
65
|
+
|Designation: S/W Engineer (3 Items)|
|
66
|
+
|Designation: Senior S/W Engineer (2 Items)|
|
45
67
|
|
46
68
|
|
47
69
|
|
@@ -3,12 +3,12 @@ When /^I have the Basic Grid opened$/ do
|
|
3
3
|
@page = BasicGridExample.new(@browser)
|
4
4
|
end
|
5
5
|
|
6
|
-
When /^I retrieve a
|
6
|
+
When /^I retrieve a GxtHeaderGrid widget$/ do
|
7
7
|
@element = @page.grid_element
|
8
8
|
end
|
9
9
|
|
10
10
|
|
11
|
-
When /^the
|
11
|
+
When /^the GxtHeaderGrid should have "(\d+)" rows$/ do |rows|
|
12
12
|
@element.rows.should == rows.to_i
|
13
13
|
end
|
14
14
|
|
@@ -28,15 +28,15 @@ Then /^the cell data should be '([^"]*)'$/ do |expected|
|
|
28
28
|
@cell_data.should == expected
|
29
29
|
end
|
30
30
|
|
31
|
-
When /^I retrieve a
|
31
|
+
When /^I retrieve a GxtHeaderGrid widget by "([^\"]*)"$/ do |how|
|
32
32
|
@element = @page.send "table_#{how}_element"
|
33
33
|
end
|
34
34
|
|
35
|
-
When /^I retrieve a
|
35
|
+
When /^I retrieve a GxtHeaderGrid widget by "([^\"]*)" and "([^\"]*)"$/ do |param1, param2|
|
36
36
|
@element = @page.send "table_#{param1}_#{param2}_element"
|
37
37
|
end
|
38
38
|
|
39
|
-
When /^I retrieve a
|
39
|
+
When /^I retrieve a GxtHeaderGrid widget while the script is executing$/ do
|
40
40
|
@element = @page.table_element(:id => 'table_id')
|
41
41
|
end
|
42
42
|
|
@@ -5,4 +5,62 @@ end
|
|
5
5
|
|
6
6
|
When /^I retrieve a GxtGroupingGrid widget$/ do
|
7
7
|
@element = @page.grouping_grid_element
|
8
|
+
end
|
9
|
+
|
10
|
+
Then /^The grid should contain (\d+) groups$/ do |group_count|
|
11
|
+
@element.groups.size.should == group_count.to_i
|
12
|
+
end
|
13
|
+
|
14
|
+
When /^The group headings should contain$/ do |table|
|
15
|
+
found = false
|
16
|
+
@element.groups.each do |heading|
|
17
|
+
first_column = table.rows.map {|row| row[0]}
|
18
|
+
first_column.should include heading.name
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
When /^The "([^"]*)" Group is expanded$/ do |group|
|
23
|
+
@group = @element.group(group)
|
24
|
+
@group.expand
|
25
|
+
@group.should be_expanded
|
26
|
+
end
|
27
|
+
|
28
|
+
When /^I collapse the group$/ do
|
29
|
+
@group.collapse
|
30
|
+
@group.should be_collapsed
|
31
|
+
end
|
32
|
+
|
33
|
+
Then /^The rows should not be visible$/ do
|
34
|
+
@group.should be_collapsed
|
35
|
+
@group.each do |row|
|
36
|
+
row.should_not be_visible
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
When /^The "([^"]*)" Group is collapsed$/ do |group|
|
41
|
+
@group = @element.group(group)
|
42
|
+
@group.collapse
|
43
|
+
@group.should be_collapsed
|
44
|
+
end
|
45
|
+
|
46
|
+
When /^I expand the group$/ do
|
47
|
+
@group.expand
|
48
|
+
@group.should be_expanded
|
49
|
+
end
|
50
|
+
|
51
|
+
Then /^the rows should be visible$/ do
|
52
|
+
@group.should be_expanded
|
53
|
+
@group.each do |row|
|
54
|
+
row.should be_visible
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
Then /^the group headings should contain in order$/ do |table|
|
59
|
+
(1..table.rows.size).each do |index|
|
60
|
+
table.rows[index][0].should include @element.group(index).heading.name
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
When /^I select Group By This Field$/ do
|
65
|
+
@page.column_menu_element.group_by_this_field
|
8
66
|
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
When /^I have the Basic Tree opened$/ do
|
2
|
+
@page.basic_tree_element.click
|
3
|
+
@page = BasicTreeExample.new(@browser)
|
4
|
+
end
|
5
|
+
When /^I retrieve a GxtTree widget$/ do
|
6
|
+
@element = @page.basic_tree_element
|
7
|
+
end
|
8
|
+
When /^I get the top level tree nodes$/ do
|
9
|
+
@element = @page.basic_tree_element
|
10
|
+
end
|
11
|
+
Then /^the count should be (\d+)$/ do |expected_count|
|
12
|
+
@element.child_nodes.size.should == expected_count.to_i
|
13
|
+
end
|
14
|
+
When /^I expand the "([^"]*)" tree node$/ do |node_name|
|
15
|
+
@element.node(node_name).expand
|
16
|
+
end
|
17
|
+
Then /^The "([^"]*)" node should be visible$/ do |node_name|
|
18
|
+
@element.node(node_name).should be_visible
|
19
|
+
end
|
20
|
+
Given /^the "([^"]*)" node is collapsed$/ do |node_name|
|
21
|
+
@element = @page.basic_tree_element.node(node_name)
|
22
|
+
@element.collapse
|
23
|
+
end
|
24
|
+
When /^I click on the node joint$/ do
|
25
|
+
@element.joint.click
|
26
|
+
end
|
27
|
+
Then /^the node should be expanded$/ do
|
28
|
+
@element.should be_expanded
|
29
|
+
@element.child_nodes.each do |node|
|
30
|
+
node.should be_visible
|
31
|
+
end
|
32
|
+
end
|
33
|
+
Given /^the "([^"]*)" node is expanded$/ do |node_name|
|
34
|
+
@element = @page.basic_tree_element.node(node_name)
|
35
|
+
@element.expand
|
36
|
+
end
|
37
|
+
Then /^the node should be collapsed$/ do
|
38
|
+
@element.should be_collapsed
|
39
|
+
@element.child_nodes.each do |node|
|
40
|
+
node.should_not be_visible
|
41
|
+
end
|
42
|
+
end
|
43
|
+
When /^I double-click on the node$/ do
|
44
|
+
@element.click
|
45
|
+
@element.double_click
|
46
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
class BasicTreeExample
|
2
|
+
include PageObject
|
3
|
+
|
4
|
+
TREE_CONTAINER_CLASS = 'x-tree3-node-ct'
|
5
|
+
button(:expand, :text=>'Expand All')
|
6
|
+
button(:collapse, :text=>'Collapse All')
|
7
|
+
|
8
|
+
gxt_basic_tree(:basic_tree, :xpath=>"//div[contains(@class,'#{TREE_CONTAINER_CLASS}')]")
|
9
|
+
end
|
@@ -1,5 +1,8 @@
|
|
1
1
|
class GroupingGridExample
|
2
2
|
include PageObject
|
3
3
|
|
4
|
+
gxt_grouping_grid(:grouping_grid, :class => "x-grid3")
|
5
|
+
gxt_group_column_menu(:column_menu, :xpath=>"//div[contains(@class,' x-menu-list')]")
|
6
|
+
gxt_column_selection_menu(:column_selection_menu, :xpath=>"(//div[contains(@class,'x-menu-list') and not(contains(@class, 'x-menu-list-item'))])[2]")
|
4
7
|
|
5
8
|
end
|
data/gxt-widget.gemspec
CHANGED
@@ -19,7 +19,7 @@ Gem::Specification.new do |s|
|
|
19
19
|
s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
|
20
20
|
s.require_paths = ["lib"]
|
21
21
|
|
22
|
-
s.add_dependency 'page-object', '>= 0.
|
22
|
+
s.add_dependency 'page-object', '>= 0.9.1'
|
23
23
|
|
24
24
|
s.add_development_dependency 'rspec', '>= 2.12.0'
|
25
25
|
s.add_development_dependency 'cucumber', '< 1.2.0'
|
data/lib/gxt-widgets.rb
CHANGED
@@ -7,8 +7,12 @@ require 'gxt-widgets/gxt_grid_header_row'
|
|
7
7
|
require 'gxt-widgets/gxt_header_cell'
|
8
8
|
require 'gxt-widgets/modules/selectable_column'
|
9
9
|
require 'gxt-widgets/modules/sortable_column'
|
10
|
+
require 'gxt-widgets/modules/groupable_column'
|
10
11
|
require 'gxt-widgets/gxt_column_menu'
|
11
12
|
require 'gxt-widgets/gxt_column_selection_menu'
|
13
|
+
require 'gxt-widgets/gxt_grouping_grid'
|
14
|
+
require 'gxt-widgets/gxt_group_column_menu'
|
15
|
+
require 'gxt-widgets/gxt_basic_tree'
|
12
16
|
|
13
17
|
module GxtWidgets
|
14
18
|
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'watir-webdriver'
|
2
|
+
require 'page-object/platforms/watir_webdriver/table'
|
3
|
+
require 'gxt-widgets/row_container'
|
4
|
+
module GxtWidgets
|
5
|
+
class GxtBasicTree < PageObject::Elements::Div
|
6
|
+
|
7
|
+
PageObject.register_widget :gxt_basic_tree, GxtBasicTree, 'div'
|
8
|
+
|
9
|
+
def child_nodes
|
10
|
+
self.gxt_basic_tree_elements(:xpath=>".//child::div[contains(@class,'x-tree3-node')]")
|
11
|
+
end
|
12
|
+
|
13
|
+
def name
|
14
|
+
node_contents.span_element(:class=>"x-tree3-node-text").text
|
15
|
+
end
|
16
|
+
|
17
|
+
def node(node_name)
|
18
|
+
node_index = child_nodes.find_index do |node|
|
19
|
+
node.name == node_name
|
20
|
+
end
|
21
|
+
child_nodes[node_index]
|
22
|
+
end
|
23
|
+
|
24
|
+
def joint
|
25
|
+
node_contents.image_element(:xpath=>".//img[contains(@class,'x-tree3-node-joint')]")
|
26
|
+
end
|
27
|
+
|
28
|
+
def expand
|
29
|
+
joint.click unless self.expanded?
|
30
|
+
end
|
31
|
+
|
32
|
+
def expanded?
|
33
|
+
self.node_container.visible?
|
34
|
+
end
|
35
|
+
|
36
|
+
|
37
|
+
def collapse
|
38
|
+
joint.click unless self.collapsed?
|
39
|
+
end
|
40
|
+
|
41
|
+
def collapsed?
|
42
|
+
!self.node_container.visible?
|
43
|
+
end
|
44
|
+
|
45
|
+
|
46
|
+
|
47
|
+
def node_contents
|
48
|
+
self.div_element(:xpath=>".//div[contains(@class,'x-tree3-el')]")
|
49
|
+
end
|
50
|
+
|
51
|
+
def node_container
|
52
|
+
self.div_element(:xpath=>".//div[contains(@class,'x-tree3-node-ct')]")
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
end
|
data/lib/gxt-widgets/gxt_grid.rb
CHANGED
@@ -1,19 +1,11 @@
|
|
1
1
|
require 'watir-webdriver'
|
2
2
|
require 'page-object/platforms/watir_webdriver/table'
|
3
|
+
require 'gxt-widgets/row_container'
|
3
4
|
module GxtWidgets
|
4
|
-
class GxtGrid <
|
5
|
+
class GxtGrid < GxtWidgets::RowContainer
|
5
6
|
|
6
7
|
PageObject.register_widget :gxt_grid, GxtGrid, 'div'
|
7
8
|
|
8
|
-
protected
|
9
|
-
def child_xpath
|
10
|
-
".//descendant::tr"
|
11
|
-
end
|
12
|
-
|
13
|
-
def initialize_row(row_element, platform)
|
14
|
-
Object::GxtWidgets::GxtGridRow.new(row_element, self, platform)
|
15
|
-
end
|
16
|
-
|
17
9
|
def initialize_header(header_element, platform)
|
18
10
|
Object::GxtWidgets::GxtGridHeaderRow.new(header_element, self, platform)
|
19
11
|
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'watir-webdriver'
|
2
|
+
require 'page-object/platforms/watir_webdriver/table'
|
3
|
+
module GxtWidgets
|
4
|
+
class GxtGridGroup < GxtWidgets::RowContainer
|
5
|
+
|
6
|
+
attr_reader :container
|
7
|
+
|
8
|
+
def name
|
9
|
+
group_title.text
|
10
|
+
end
|
11
|
+
|
12
|
+
def expanded?
|
13
|
+
not collapsed?
|
14
|
+
end
|
15
|
+
|
16
|
+
def collapsed?
|
17
|
+
attribute(:class).include? "x-grid-group-collapsed"
|
18
|
+
end
|
19
|
+
|
20
|
+
def expand
|
21
|
+
group_title.click unless expanded?
|
22
|
+
end
|
23
|
+
|
24
|
+
def collapse
|
25
|
+
group_title.click if expanded?
|
26
|
+
end
|
27
|
+
|
28
|
+
def initialize(element, container, platform)
|
29
|
+
@element = element
|
30
|
+
@container = container
|
31
|
+
include_platform_for platform
|
32
|
+
end
|
33
|
+
|
34
|
+
@protected
|
35
|
+
def group_title
|
36
|
+
div_element(:class=>'x-grid-group-hd')
|
37
|
+
end
|
38
|
+
|
39
|
+
def initialize_row(row_element, platform)
|
40
|
+
Object::GxtWidgets::GxtGridRow.new(row_element, container, platform)
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'watir-webdriver'
|
2
|
+
require 'page-object/platforms/watir_webdriver/table'
|
3
|
+
require 'gxt-widgets/gxt_grid_group'
|
4
|
+
require 'gxt-widgets/platforms/selenium_webdriver/gxt_grouping_grid'
|
5
|
+
require 'gxt-widgets/platforms/watir_webdriver/gxt_grouping_grid'
|
6
|
+
|
7
|
+
module GxtWidgets
|
8
|
+
class GxtGroupingGrid < GxtWidgets::GxtGrid
|
9
|
+
|
10
|
+
PageObject.register_widget :gxt_grouping_grid, GxtGroupingGrid, 'div'
|
11
|
+
attr_reader :current_platform
|
12
|
+
|
13
|
+
def initialize(element, platform)
|
14
|
+
super(element,platform)
|
15
|
+
@current_platform = platform
|
16
|
+
end
|
17
|
+
|
18
|
+
def groups
|
19
|
+
get_groups.map do |group|
|
20
|
+
initialize_group(group, @current_platform)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def group(group_index)
|
25
|
+
group_index = find_group_index_by_title(group_index, groups) if group_index.kind_of?(String)
|
26
|
+
return nil unless group_index
|
27
|
+
groups[group_index]
|
28
|
+
end
|
29
|
+
|
30
|
+
def initialize_group(group_element, platform)
|
31
|
+
Object::GxtWidgets::GxtGridGroup.new(group_element, self, platform)
|
32
|
+
end
|
33
|
+
|
34
|
+
|
35
|
+
def find_group_index_by_title(group_name, group_elements)
|
36
|
+
group_elements.find_index { |grp|
|
37
|
+
grp.name.include? group_name }
|
38
|
+
end
|
39
|
+
|
40
|
+
def include_platform_for platform
|
41
|
+
super
|
42
|
+
if platform[:platform] == :watir_webdriver
|
43
|
+
require 'gxt-widgets/platforms/watir_webdriver/gxt_grid'
|
44
|
+
self.class.send :include, GxtWidgets::Platforms::WatirWebDriver::GxtGroupingGrid
|
45
|
+
elsif platform[:platform] == :selenium_webdriver
|
46
|
+
require 'gxt-widgets/platforms/selenium_webdriver/gxt_grid'
|
47
|
+
self.class.send :include, GxtWidgets::Platforms::SeleniumWebDriver::GxtGroupingGrid
|
48
|
+
else
|
49
|
+
raise ArgumentError, "expect platform to be :watir_webdriver or :selenium_webdriver"
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -1,17 +1,11 @@
|
|
1
1
|
require "gxt-widgets/gxt_grid_row"
|
2
2
|
require 'gxt-widgets/gxt_grid_header_row'
|
3
|
+
require 'gxt-widgets/platforms/selenium_webdriver/row_container'
|
3
4
|
module GxtWidgets
|
4
5
|
module Platforms
|
5
6
|
module SeleniumWebDriver
|
6
7
|
module GxtGrid
|
7
|
-
include
|
8
|
-
|
9
|
-
def [](idx)
|
10
|
-
eles = table_rows
|
11
|
-
idx = find_index_by_title(idx, eles) if idx.kind_of?(String)
|
12
|
-
return nil unless idx
|
13
|
-
initialize_row(eles[idx], :platform => :selenium_webdriver)
|
14
|
-
end
|
8
|
+
include GxtWidgets::Platforms::SeleniumWebDriver::RowContainer
|
15
9
|
|
16
10
|
def header
|
17
11
|
initialize_header(table_rows[0], :platform => :selenium_webdriver)
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require "page-object/platforms/selenium_webdriver/table_row"
|
2
|
+
require 'gxt-widgets/platforms/selenium_webdriver/row_container'
|
3
|
+
module GxtWidgets
|
4
|
+
module Platforms
|
5
|
+
module SeleniumWebDriver
|
6
|
+
module GxtGroupingGrid
|
7
|
+
include GxtWidgets::Platforms::SeleniumWebDriver::RowContainer
|
8
|
+
|
9
|
+
private
|
10
|
+
|
11
|
+
def get_groups
|
12
|
+
element.find_elements(:xpath, "//div[contains(@class, 'x-grid-group ')]")
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require "gxt-widgets/gxt_grid_row"
|
2
|
+
require 'gxt-widgets/gxt_grid_header_row'
|
3
|
+
require 'page-object/platforms/selenium_webdriver/table'
|
4
|
+
module GxtWidgets
|
5
|
+
module Platforms
|
6
|
+
module SeleniumWebDriver
|
7
|
+
module RowContainer
|
8
|
+
include PageObject::Platforms::SeleniumWebDriver::Table
|
9
|
+
|
10
|
+
def [](idx)
|
11
|
+
eles = table_rows
|
12
|
+
idx = find_index_by_title(idx, eles) if idx.kind_of?(String)
|
13
|
+
return nil unless idx
|
14
|
+
initialize_row(eles[idx], :platform => :selenium_webdriver)
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
|
@@ -1,32 +1,15 @@
|
|
1
1
|
require "gxt-widgets/gxt_grid_row"
|
2
2
|
require 'gxt-widgets/gxt_grid_header_row'
|
3
|
+
require 'gxt-widgets/platforms/watir_webdriver/row_container'
|
3
4
|
module GxtWidgets
|
4
5
|
module Platforms
|
5
6
|
module WatirWebDriver
|
6
7
|
module GxtGrid
|
7
|
-
include
|
8
|
-
|
9
|
-
def [](idx)
|
10
|
-
idx = find_index_by_title(idx) if idx.kind_of?(String)
|
11
|
-
return nil unless idx
|
12
|
-
initialize_row(row_collection[idx], :platform => :watir_webdriver)
|
13
|
-
end
|
8
|
+
include GxtWidgets::Platforms::WatirWebDriver::RowContainer
|
14
9
|
|
15
10
|
def header
|
16
11
|
initialize_header(row_collection[0], :platform => :watir_webdriver)
|
17
12
|
end
|
18
|
-
|
19
|
-
private
|
20
|
-
|
21
|
-
def find_index_by_title(row_title)
|
22
|
-
row_collection.find_index do |row|
|
23
|
-
row.cells.any? { |col| col.text.include? row_title }
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
def row_collection
|
28
|
-
element.trs(:xpath => child_xpath)
|
29
|
-
end
|
30
13
|
end
|
31
14
|
end
|
32
15
|
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'gxt-widgets/platforms/watir_webdriver/row_container'
|
2
|
+
module GxtWidgets
|
3
|
+
module Platforms
|
4
|
+
module WatirWebDriver
|
5
|
+
module GxtGroupingGrid
|
6
|
+
include GxtWidgets::Platforms::WatirWebDriver::RowContainer
|
7
|
+
|
8
|
+
private
|
9
|
+
def get_groups
|
10
|
+
element.divs(:xpath, "//div[contains(@class, 'x-grid-group ')]")
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require "gxt-widgets/gxt_grid_row"
|
2
|
+
require 'gxt-widgets/gxt_grid_header_row'
|
3
|
+
module GxtWidgets
|
4
|
+
module Platforms
|
5
|
+
module WatirWebDriver
|
6
|
+
module RowContainer
|
7
|
+
include PageObject::Platforms::WatirWebDriver::Table
|
8
|
+
|
9
|
+
def [](idx)
|
10
|
+
idx = find_index_by_title(idx) if idx.kind_of?(String)
|
11
|
+
return nil unless idx
|
12
|
+
initialize_row(row_collection[idx], :platform => :watir_webdriver)
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def find_index_by_title(row_title)
|
18
|
+
row_collection.find_index do |row|
|
19
|
+
row.cells.any? { |col| col.text.include? row_title }
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def row_collection
|
24
|
+
element.trs(:xpath => child_xpath)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'watir-webdriver'
|
2
|
+
require 'page-object/platforms/watir_webdriver/table'
|
3
|
+
module GxtWidgets
|
4
|
+
class RowContainer < PageObject::Elements::Table
|
5
|
+
|
6
|
+
protected
|
7
|
+
def child_xpath
|
8
|
+
".//descendant::tr"
|
9
|
+
end
|
10
|
+
|
11
|
+
def initialize_row(row_element, platform)
|
12
|
+
Object::GxtWidgets::GxtGridRow.new(row_element, self, platform)
|
13
|
+
end
|
14
|
+
|
15
|
+
def include_platform_for platform
|
16
|
+
super
|
17
|
+
if platform[:platform] == :watir_webdriver
|
18
|
+
require 'gxt-widgets/platforms/watir_webdriver/row_container'
|
19
|
+
self.class.send :include, GxtWidgets::Platforms::WatirWebDriver::RowContainer
|
20
|
+
elsif platform[:platform] == :selenium_webdriver
|
21
|
+
require 'gxt-widgets/platforms/selenium_webdriver/row_container'
|
22
|
+
self.class.send :include, GxtWidgets::Platforms::SeleniumWebDriver::RowContainer
|
23
|
+
else
|
24
|
+
raise ArgumentError, "expect platform to be :watir_webdriver or :selenium_webdriver"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
data/lib/gxt-widgets/version.rb
CHANGED
@@ -17,7 +17,7 @@ describe GxtWidgets::GxtGridRow do
|
|
17
17
|
table_row[0].should be_instance_of PageObject::Elements::TableCell
|
18
18
|
end
|
19
19
|
|
20
|
-
it "should
|
20
|
+
it "should return the number of columns" do
|
21
21
|
table_row = GxtWidgets::GxtGridRow.new(table_row_driver, table, :platform => :selenium_webdriver)
|
22
22
|
table_row_driver.should_receive(:find_elements).with(:xpath, ".//child::td|th").and_return(table_row_driver)
|
23
23
|
table_row_driver.should_receive(:size).and_return(3)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gxt-widgets
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '0.
|
4
|
+
version: '0.2'
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2013-
|
13
|
+
date: 2013-07-21 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: page-object
|
@@ -19,7 +19,7 @@ dependencies:
|
|
19
19
|
requirements:
|
20
20
|
- - ! '>='
|
21
21
|
- !ruby/object:Gem::Version
|
22
|
-
version: 0.
|
22
|
+
version: 0.9.1
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
25
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -27,7 +27,7 @@ dependencies:
|
|
27
27
|
requirements:
|
28
28
|
- - ! '>='
|
29
29
|
- !ruby/object:Gem::Version
|
30
|
-
version: 0.
|
30
|
+
version: 0.9.1
|
31
31
|
- !ruby/object:Gem::Dependency
|
32
32
|
name: rspec
|
33
33
|
requirement: !ruby/object:Gem::Requirement
|
@@ -138,6 +138,7 @@ files:
|
|
138
138
|
- Gemfile
|
139
139
|
- Rakefile
|
140
140
|
- cucumber.yml
|
141
|
+
- features/gxt_basic_tree.feature
|
141
142
|
- features/gxt_grid.feature
|
142
143
|
- features/gxt_grid_with_grouping.feature
|
143
144
|
- features/gxt_pager.feature
|
@@ -145,30 +146,42 @@ files:
|
|
145
146
|
- features/step_definitions/gxt_grid_steps.rb
|
146
147
|
- features/step_definitions/gxt_grid_with_grouping_steps.rb
|
147
148
|
- features/step_definitions/gxt_pager_steps.rb
|
149
|
+
- features/step_definitions/gxt_tree_steps.rb
|
148
150
|
- features/support/env.rb
|
149
151
|
- features/support/hooks.rb
|
150
152
|
- features/support/pages/basic_grid_example.rb
|
153
|
+
- features/support/pages/basic_tree_example.rb
|
151
154
|
- features/support/pages/grouping_grid_example.rb
|
152
155
|
- features/support/pages/gxt_examples_page.rb
|
153
156
|
- features/support/pages/local_pagination_example.rb
|
154
157
|
- features/support/persistent_browser.rb
|
155
158
|
- gxt-widget.gemspec
|
156
159
|
- lib/gxt-widgets.rb
|
160
|
+
- lib/gxt-widgets/gxt_basic_tree.rb
|
157
161
|
- lib/gxt-widgets/gxt_column_menu.rb
|
158
162
|
- lib/gxt-widgets/gxt_column_selection_menu.rb
|
159
163
|
- lib/gxt-widgets/gxt_grid.rb
|
164
|
+
- lib/gxt-widgets/gxt_grid_group.rb
|
160
165
|
- lib/gxt-widgets/gxt_grid_header_row.rb
|
161
166
|
- lib/gxt-widgets/gxt_grid_row.rb
|
167
|
+
- lib/gxt-widgets/gxt_group_column_menu.rb
|
168
|
+
- lib/gxt-widgets/gxt_grouping_grid.rb
|
162
169
|
- lib/gxt-widgets/gxt_header_cell.rb
|
163
170
|
- lib/gxt-widgets/gxt_pager.rb
|
171
|
+
- lib/gxt-widgets/modules/groupable_column.rb
|
164
172
|
- lib/gxt-widgets/modules/selectable_column.rb
|
165
173
|
- lib/gxt-widgets/modules/sortable_column.rb
|
166
174
|
- lib/gxt-widgets/platforms/selenium_webdriver/gxt_grid.rb
|
167
175
|
- lib/gxt-widgets/platforms/selenium_webdriver/gxt_grid_header_row.rb
|
168
176
|
- lib/gxt-widgets/platforms/selenium_webdriver/gxt_grid_row.rb
|
177
|
+
- lib/gxt-widgets/platforms/selenium_webdriver/gxt_grouping_grid.rb
|
178
|
+
- lib/gxt-widgets/platforms/selenium_webdriver/row_container.rb
|
169
179
|
- lib/gxt-widgets/platforms/watir_webdriver/gxt_grid.rb
|
170
180
|
- lib/gxt-widgets/platforms/watir_webdriver/gxt_grid_header_row.rb
|
171
181
|
- lib/gxt-widgets/platforms/watir_webdriver/gxt_grid_row.rb
|
182
|
+
- lib/gxt-widgets/platforms/watir_webdriver/gxt_grouping_grid.rb
|
183
|
+
- lib/gxt-widgets/platforms/watir_webdriver/row_container.rb
|
184
|
+
- lib/gxt-widgets/row_container.rb
|
172
185
|
- lib/gxt-widgets/version.rb
|
173
186
|
- readme.md
|
174
187
|
- spec/gxt-widgets/gxt_grid_row_spec.rb
|
@@ -185,25 +198,20 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
185
198
|
- - ! '>='
|
186
199
|
- !ruby/object:Gem::Version
|
187
200
|
version: '0'
|
188
|
-
segments:
|
189
|
-
- 0
|
190
|
-
hash: -3067973274556583158
|
191
201
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
192
202
|
none: false
|
193
203
|
requirements:
|
194
204
|
- - ! '>='
|
195
205
|
- !ruby/object:Gem::Version
|
196
206
|
version: '0'
|
197
|
-
segments:
|
198
|
-
- 0
|
199
|
-
hash: -3067973274556583158
|
200
207
|
requirements: []
|
201
208
|
rubyforge_project: gxt-widgets
|
202
|
-
rubygems_version: 1.8.
|
209
|
+
rubygems_version: 1.8.24
|
203
210
|
signing_key:
|
204
211
|
specification_version: 3
|
205
212
|
summary: PageObject Widgets to simplify testing GXT applications
|
206
213
|
test_files:
|
214
|
+
- features/gxt_basic_tree.feature
|
207
215
|
- features/gxt_grid.feature
|
208
216
|
- features/gxt_grid_with_grouping.feature
|
209
217
|
- features/gxt_pager.feature
|
@@ -211,9 +219,11 @@ test_files:
|
|
211
219
|
- features/step_definitions/gxt_grid_steps.rb
|
212
220
|
- features/step_definitions/gxt_grid_with_grouping_steps.rb
|
213
221
|
- features/step_definitions/gxt_pager_steps.rb
|
222
|
+
- features/step_definitions/gxt_tree_steps.rb
|
214
223
|
- features/support/env.rb
|
215
224
|
- features/support/hooks.rb
|
216
225
|
- features/support/pages/basic_grid_example.rb
|
226
|
+
- features/support/pages/basic_tree_example.rb
|
217
227
|
- features/support/pages/grouping_grid_example.rb
|
218
228
|
- features/support/pages/gxt_examples_page.rb
|
219
229
|
- features/support/pages/local_pagination_example.rb
|