chrome.test 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. use strict;
  2. use warnings;
  3. use Selenium::Chrome;
  4. use Selenium::Remote::WDKeys;
  5. use Cwd qw{abs_path};
  6. use FindBin;
  7. use Test::More;
  8. use Test::Fatal;
  9. use Test::Deep;
  10. my $driver;
  11. is( exception { $driver = Selenium::Chrome->new(); }, undef, "can spawn new Selenium::Chrome");
  12. $driver->debug_on();
  13. ok($driver->maximize_window(),"can maximize window (WD3)");
  14. is($driver->get_capabilities()->{browserName},'chrome',"Can get Capabilities correctly (WD3)");
  15. my $sessions = $driver->get_sessions();
  16. is(scalar(@$sessions),1,"Can fall back to selenium2 to list sessions");
  17. ok($driver->status()->{ready},"status reports OK (WD3)");
  18. #TODO do something about available_engines
  19. $driver->set_timeout('page load',10000);
  20. $driver->set_timeout('script',10000);
  21. $driver->set_timeout('implicit',10000);
  22. my $timeouts = $driver->get_timeouts();
  23. is($timeouts->{pageLoad},10000,"WD3 set/get timeouts works");
  24. is($timeouts->{script},10000,"WD3 set/get timeouts works");
  25. is($timeouts->{implicit},10000,"WD3 set/get timeouts works");
  26. $driver->set_async_script_timeout(20000);
  27. $driver->set_implicit_wait_timeout(5000);
  28. $timeouts = $driver->get_timeouts();
  29. is($timeouts->{script},20000,"WD3 shim for set_async timeouts works");
  30. is($timeouts->{implicit},5000,"WD3 shim for implicit timeouts works");
  31. my $loc = abs_path("$FindBin::Bin/test.html");
  32. ok($driver->get("file://$loc"),"Can load a web page (WD3)");
  33. is($driver->get_alert_text(),"BEEE DOOO","get_alert_text works (WD3)");
  34. is(exception { $driver->dismiss_alert() }, undef, "alert can be dismissed (WD3)");
  35. #This sucker wants "value" instead of "text" like in legacy
  36. ok($driver->send_keys_to_prompt("HORGLE"),"send_keys_to_prompt works (WD3)");
  37. is(exception { $driver->accept_alert() }, undef, "alert can be accepted (WD3)");
  38. my $handle = $driver->get_current_window_handle();
  39. ok($handle,"Got a window handle (WD3)");
  40. cmp_bag($driver->get_window_handles(),[$handle],"Can list window handles (WD3)");
  41. my $sz = $driver->get_window_size();
  42. ok(defined $sz->{height},"get_window_size works (WD3)");
  43. ok(defined $sz->{width},"get window size works (WD3)");
  44. my $pos = $driver->get_window_position();
  45. ok(defined $pos->{x},"get_window_size works (WD3)");
  46. ok(defined $pos->{y},"get window size works (WD3)");
  47. like($driver->get_current_url(),qr/test.html$/,"get_current_url works (WD3)");
  48. like($driver->get_title(),qr/test/i,"get_title works (WD3)");
  49. my $otherloc = abs_path("$FindBin::Bin/other.html");
  50. $driver->get("file://$otherloc");
  51. $driver->go_back();
  52. $driver->dismiss_alert();
  53. $driver->dismiss_alert();
  54. like($driver->get_title(),qr/test/i,"go_back works (WD3)");
  55. $driver->go_forward();
  56. like($driver->get_page_source(),qr/ZIPPY/,"go_forward & get_page_source works (WD3)");
  57. is(exception { $driver->refresh() }, undef, "refresh works (WD3)");
  58. $driver->go_back();
  59. $driver->dismiss_alert();
  60. $driver->dismiss_alert();
  61. #TODO execute_*_script testing
  62. ok($driver->screenshot(),"can get base64'd whole page screenshot (WD3)");
  63. SKIP: {
  64. skip "chromedriver doesn't know how to take element screenshots", 1;
  65. ok($driver->find_element('body','tag_name')->screenshot(0),"can get element screenshot (WD3 ONLY) and find_element (WD3) works.");
  66. }
  67. isa_ok($driver->find_element('red','class'),"Selenium::Remote::WebElement");
  68. isa_ok($driver->find_element('text','name'),"Selenium::Remote::WebElement");
  69. isa_ok($driver->find_element('Test Link', 'link_text'),"Selenium::Remote::WebElement");
  70. isa_ok($driver->find_element('Test', 'partial_link_text'),"Selenium::Remote::WebElement");
  71. is(scalar(@{$driver->find_elements('red','class')}),2,"can find multiple elements correctly");
  72. my $lem = $driver->find_element('body', 'tag_name');
  73. isa_ok($driver->find_child_element($lem, 'red','class'),"Selenium::Remote::WebElement");
  74. isa_ok($driver->find_child_element($lem, 'text','name'),"Selenium::Remote::WebElement");
  75. isa_ok($driver->find_child_element($lem, 'Test Link', 'link_text'),"Selenium::Remote::WebElement");
  76. isa_ok($driver->find_child_element($lem, 'Test', 'partial_link_text'),"Selenium::Remote::WebElement");
  77. $lem = $driver->find_element('form','tag_name');
  78. is(scalar(@{$driver->find_child_elements($lem,'./*')}),6,"can find child elements (WD3)");
  79. isa_ok($driver->get_active_element(),"Selenium::Remote::WebElement");
  80. is(exception { $driver->cache_status() },undef, "cache_status implemented in krom");
  81. my $coords = {
  82. latitude => 40.714353,
  83. longitude => -74.005973,
  84. };
  85. ok($driver->set_geolocation(location => $coords),"can set_geolocation in krom");
  86. is( $driver->get_geolocation()->{latitude},$coords->{latitude},"cang get_geolocation in krom");
  87. like($driver->upload_file($otherloc),qr/other.html$/,"upload_file fallback works");
  88. ok($driver->switch_to_frame($driver->find_element('frame', 'id')),"can switch to frame (WD3)");
  89. ok($driver->switch_to_frame(),"can switch to parent frame (WD3 only)");
  90. ok($driver->set_window_position(1,1),"can set window position (WD3)");
  91. ok($driver->set_window_size(640,480),"can set window size (WD3)");
  92. SKIP: {
  93. skip "chromedriver does not minimize", 1;
  94. ok($driver->minimize_window(),"can minimize window (WD3 only)");
  95. }
  96. ok($driver->fullscreen_window(),"can fullscreen window (WD3 only)");
  97. #XXX chrome has issued a fatwah against cookies issued by file:// urls
  98. is(scalar(@{$driver->get_all_cookies()}),0,"can get cookie list (WD3)");
  99. $driver->delete_all_cookies();
  100. is(scalar(@{$driver->get_all_cookies()}),0,"can delete all cookies (WD3)");
  101. ok($driver->mouse_move_to_location( element => $driver->find_element('a','tag_name')),"Can use new WD3 Actions API to emulate mouse_move_to_location");
  102. $driver->click();
  103. my $handles = $driver->get_window_handles();
  104. is(scalar(@$handles),2,"Can move to element and then click it correctly (WD3)");
  105. $driver->switch_to_window($handles->[1]);
  106. is(exception { $driver->close() }, undef, "Can close new window (WD3)");
  107. cmp_bag($driver->get_window_handles,[$handles->[0]],"Correct window closed (WD3)");
  108. $driver->switch_to_window($handles->[0]);
  109. my $input = $driver->find_element('input','tag_name');
  110. $driver->mouse_move_to_location( element => $input );
  111. $driver->click();
  112. is(exception {$driver->send_modifier('Shift','down')}, undef, "chromedriver can send_modifier");
  113. $driver->send_keys_to_active_element('howdy',KEYS->{tab});
  114. $input->send_keys('eee');
  115. $driver->mouse_move_to_location( element => $driver->find_element('body','tag_name'));
  116. $driver->click();
  117. #XXX this has to be a BUG in the driver, the keys are getting thru
  118. is($input->get_attribute('value'),'defaultHOWDYEEE',"element->get_attribute() emulates old behavior thru get_property (WD3)");
  119. TODO: {
  120. local $TODO = "chrome can't get_property()";
  121. is($input->get_attribute('value',1),'default',"element->get_attribute() can do it's actual job (WD3)");
  122. }
  123. is($driver->execute_script(qq/ return document.querySelector('input').value /),'defaultHOWDYEEE',"execute_script works, and so does send_keys_to_active_element & element->send_keys (WD3)");
  124. $input->clear();
  125. is($input->get_property('value'),'',"clear() works (WD3)");
  126. is(exception { $driver->button_down() },undef,"Can button down (WD3)");
  127. is(exception { $driver->button_up() },undef,"Can button up (WD3)");
  128. SKIP: {
  129. skip "chrome don't actionChain", 1;
  130. is(exception { $driver->release_general_action() }, undef, "Can release_general_action (WD3)");
  131. }
  132. ok($driver->find_element('radio2','id')->is_selected(),"WD3 is_selected() works");
  133. my $l1 = $driver->find_element('radio1','id');
  134. $l1->set_selected();
  135. $l1->set_selected();
  136. ok($l1->is_selected(),"WD3 set_selected works");
  137. $l1->toggle();
  138. TODO: {
  139. local $TODO = "chrome toggle won't allow bogus values (radios with both disabled)";
  140. ok(!$l1->is_selected(),"WD3 toggle works: off");
  141. }
  142. $l1->toggle();
  143. ok($l1->is_selected(),"WD3 toggle works: on");
  144. my $l2 = $driver->find_element('hammertime','id');
  145. is( $l2->is_enabled(),0,"is_enabled works (WD3)");
  146. #ok( $l2->get_element_location()->{x},"Can get element rect (WD3)");
  147. #ok( $l2->get_size()->{'height'}, "Size shim on rect works (WD3)");
  148. is( $l2->get_tag_name(),'input',"get_tag_name works (WD3)");
  149. is( exception { $l2->get_element_location_in_view() }, undef, "get_element_location_in_view available in gegl krom");
  150. is($driver->find_element('hidon','id')->is_displayed(),0,"is_displayed returns false for type=hidden elements");
  151. my $gone = $driver->find_element('no-see-em','id');
  152. is($gone->is_displayed(),0,"is_displayed returns false for display=none");
  153. is($gone->is_enabled(),1,"is_enabled returns true for non-input elements");
  154. is($driver->find_element('h1','tag_name')->get_text(),'Howdy Howdy Howdy', "get_text works (WD3)");
  155. $driver->find_element('clickme','id')->click();
  156. is(exception { $driver->dismiss_alert() }, undef, "Can click element (WD3)");
  157. $driver->find_element('form','tag_name')->submit();
  158. like($driver->get_page_source(),qr/ZIPPY/,"elem submit() works (WD3)");
  159. #Pretty sure this one has enough 'inertia' to not disappear all the sudden
  160. $driver->get('http://w3.org/History.html');
  161. $driver->add_cookie('foo','bar','/',undef,0,0,time()+5000);
  162. is(scalar(@{$driver->get_all_cookies()}),1,"can get cookie (WD3)");
  163. is($driver->get_cookie_named('foo')->{value},'bar',"can get cookie by name (WD3 only)");
  164. $driver->delete_cookie_named('foo');
  165. is(scalar(@{$driver->get_all_cookies()}),0,"can delete named cookies (WD3)");
  166. is(exception { $driver->quit() }, undef, "Can quit (WD3)");
  167. my $port = $driver->port();
  168. is( exception { $driver->shutdown_binary; }, undef, "can shutdown binary correctly");
  169. sleep 2;
  170. my $cmd = "lsof -t -i :$port";
  171. my $pid = `$cmd`;
  172. chomp $pid;
  173. is($pid,'',"Destructor appears to have run shutdown_binary and whacked the driver process");
  174. done_testing();