sanity-safari.test 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. use strict;
  2. use warnings;
  3. use Cwd qw{abs_path};
  4. use FindBin;
  5. use Test::More;
  6. use Test::Fatal;
  7. use Test::Deep;
  8. use Selenium::Remote::Driver;
  9. use Selenium::Remote::WDKeys;
  10. #TODO: cover new_from_caps
  11. my $driver = Selenium::Remote::Driver->new(
  12. remote_server_addr => 'localhost',
  13. port => 4444,
  14. browser_name => 'safari',
  15. accept_ssl_certs => 1,
  16. );
  17. isa_ok($driver,'Selenium::Remote::Driver',"Can get new S::R::D with WebDriver3");
  18. $driver->debug_on();
  19. is($driver->get_capabilities()->{browserName},'safari',"Can get Capabilities correctly (safaridriver)");
  20. my $sessions = $driver->get_sessions();
  21. is(scalar(@$sessions),1,"Can fall back to selenium2 to list sessions");
  22. ok($driver->status()->{ready},"status reports OK (safaridriver)");
  23. #TODO do something about available_engines
  24. $driver->set_timeout('page load',10000);
  25. $driver->set_timeout('script',10000);
  26. $driver->set_timeout('implicit',10000);
  27. SKIP: {
  28. skip("safari don't do get_timeouts",3);
  29. my $timeouts = $driver->get_timeouts();
  30. is($timeouts->{pageLoad},10000,"safaridriver set/get timeouts works");
  31. is($timeouts->{script},10000,"safaridriver set/get timeouts works");
  32. is($timeouts->{implicit},10000,"safaridriver set/get timeouts works");
  33. }
  34. is( exception { $driver->set_async_script_timeout(20000) }, undef, "can set_async_script_timeout");
  35. is( exception { $driver->set_implicit_wait_timeout(5000) }, undef, "can set_implicit_wait_timeout");
  36. my $loc = abs_path("$FindBin::Bin/test.html");
  37. TODO: {
  38. local $TODO = "get on pages w/ insta-spawn alerts times out on safari";
  39. is( exception { $driver->get("file://$loc") }, undef,"Can load a web page (safaridriver)");
  40. }
  41. is($driver->get_alert_text(),"BEEE DOOO","get_alert_text works (safaridriver)");
  42. is(exception { $driver->dismiss_alert() }, undef, "alert can be dismissed (safaridriver)");
  43. sleep 5;
  44. #This sucker wants "value" instead of "text" like in legacy
  45. ok($driver->send_keys_to_prompt("HORGLE"),"send_keys_to_prompt works (safaridriver)");
  46. is(exception { $driver->accept_alert() }, undef, "alert can be accepted (safaridriver)");
  47. my $handle = $driver->get_current_window_handle();
  48. ok($handle,"Got a window handle (safaridriver)");
  49. cmp_bag($driver->get_window_handles(),[$handle],"Can list window handles (safaridriver)");
  50. my $sz = $driver->get_window_size();
  51. ok(defined $sz->{height},"get_window_size works (safaridriver)");
  52. ok(defined $sz->{width},"get window size works (safaridriver)");
  53. my $pos = $driver->get_window_position();
  54. ok(defined $pos->{x},"get_window_size works (safaridriver)");
  55. ok(defined $pos->{y},"get window size works (safaridriver)");
  56. like($driver->get_current_url(),qr/test.html$/,"get_current_url works (safaridriver)");
  57. like($driver->get_title(),qr/test/i,"get_title works (safaridriver)");
  58. my $otherloc = abs_path("$FindBin::Bin/other.html");
  59. $driver->get("file://$otherloc");
  60. $driver->go_back();
  61. like($driver->get_title(),qr/test/i,"go_back works (safaridriver)");
  62. $driver->go_forward();
  63. like($driver->get_page_source(),qr/ZIPPY/,"go_forward & get_page_source works (safaridriver)");
  64. is(exception { $driver->refresh() }, undef, "refresh works (safaridriver)");
  65. $driver->go_back();
  66. #TODO execute_*_script testing
  67. ok($driver->screenshot(),"can get base64'd whole page screenshot (safaridriver)");
  68. SKIP: {
  69. skip "can't element screenshot on safari", 1;
  70. ok($driver->find_element('body','tag_name')->screenshot(0),"can get element screenshot (safaridriver ONLY) and find_element (safaridriver) works.");
  71. }
  72. isa_ok($driver->find_element('red','class'),"Selenium::Remote::WebElement");
  73. isa_ok($driver->find_element('text','name'),"Selenium::Remote::WebElement");
  74. isa_ok($driver->find_element('Test Link', 'link_text'),"Selenium::Remote::WebElement");
  75. isa_ok($driver->find_element('Test', 'partial_link_text'),"Selenium::Remote::WebElement");
  76. is(scalar(@{$driver->find_elements('red','class')}),2,"can find multiple elements correctly");
  77. my $lem = $driver->find_element('body', 'tag_name');
  78. isa_ok($driver->find_child_element($lem, 'red','class'),"Selenium::Remote::WebElement");
  79. isa_ok($driver->find_child_element($lem, 'text','name'),"Selenium::Remote::WebElement");
  80. isa_ok($driver->find_child_element($lem, 'Test Link', 'link_text'),"Selenium::Remote::WebElement");
  81. isa_ok($driver->find_child_element($lem, 'Test', 'partial_link_text'),"Selenium::Remote::WebElement");
  82. $lem = $driver->find_element('form','tag_name');
  83. is(scalar(@{$driver->find_child_elements($lem,'./*')}),6,"can find child elements (safaridriver)");
  84. isa_ok($driver->get_active_element(),"Selenium::Remote::WebElement");
  85. like(exception { $driver->cache_status() },qr/not implemented/, "cache_status unimplemented in safaridriver");
  86. like(exception {
  87. diag explain $driver->set_geolocation(location => {
  88. latitude => 40.714353,
  89. longitude => -74.005973,
  90. altitude => 0.056747
  91. });
  92. }, qr/not implemented/, "set_geolocation unimplemented in safaridriver");
  93. like(exception { $driver->get_geolocation() }, qr/not implemented/, "get_geolocation unimplemented in safaridriver");
  94. ok($driver->get_log('server'), "get_log fallback works");
  95. ok( scalar(@{$driver->get_log_types()}),"can fallback for get_log_types");
  96. like(exception { $driver->set_orientation("LANDSCAPE") }, qr/not implemented/, "set_orientation unimplemented in safaridriver");
  97. like(exception { $driver->get_orientation() }, qr/not implemented/, "get_orientation unimplemented in safaridriver");
  98. like($driver->upload_file($otherloc),qr/other.html$/,"upload_file fallback works");
  99. #Jinkies, this stuff is cool, it prints the selenium server help page @_@
  100. like( exception { $driver->get_local_storage_item('whee') },qr/help/i,"get_local_storage_item prints help page");
  101. like( exception { $driver->delete_local_storage_item('whee') },qr/405/i,"get_local_storage_item prints help page");
  102. ok($driver->switch_to_frame($driver->find_element('frame', 'id')),"can switch to frame (safaridriver)");
  103. ok($driver->switch_to_frame(),"can switch to parent frame (safaridriver only)");
  104. ok($driver->set_window_position(1,1),"can set window position (safaridriver)");
  105. ok($driver->set_window_size(200,200),"can set window size (safaridriver)");
  106. ok($driver->maximize_window(),"can maximize window (safaridriver)");
  107. SKIP: {
  108. skip "safari can't minimize or fullscreen", 2;
  109. ok($driver->minimize_window(),"can minimize window (safaridriver only)");
  110. ok($driver->fullscreen_window(),"can fullscreen window (safaridriver only)");
  111. }
  112. is(scalar(@{$driver->get_all_cookies()}),1,"can get cookie list (safaridriver)");
  113. TODO: {
  114. local $TODO='delete_all_cookies may be able to get raced by get_all_cookies';
  115. $driver->delete_all_cookies();
  116. is(scalar(@{$driver->get_all_cookies()}),0,"can delete all cookies (safaridriver)");
  117. }
  118. SKIP: {
  119. skip 'global move/click seems broken', 4;
  120. ok($driver->mouse_move_to_location( element => $driver->find_element('a','tag_name')),"Can use new safaridriver Actions API to emulate mouse_move_to_location");
  121. $driver->click();
  122. sleep 5;
  123. my $handles = $driver->get_window_handles();
  124. is(scalar(@$handles),2,"Can move to element and then click it correctly (safaridriver)");
  125. $driver->switch_to_window($handles->[1]);
  126. sleep 5;
  127. is(exception { $driver->close() }, undef, "Can close new window (safaridriver)");
  128. sleep 5;
  129. cmp_bag($driver->get_window_handles,[$handles->[0]],"Correct window closed (safaridriver)");
  130. $driver->switch_to_window($handles->[0]);
  131. }
  132. my $input = $driver->find_element('input','tag_name');
  133. $driver->mouse_move_to_location( element => $input );
  134. $driver->click();
  135. #TODO pretty sure this isn't working right
  136. #$driver->send_modifier('Shift','down');
  137. $driver->send_keys_to_active_element('howdy',KEYS->{tab});
  138. $input->send_keys('eee');
  139. $driver->mouse_move_to_location( element => $driver->find_element('body','tag_name'));
  140. $driver->click();
  141. TODO: {
  142. local $TODO = "safari driver clears input on all key sends, unfortunately";
  143. is($input->get_attribute('value'),'defaulthowdyeee',"element->get_attribute() emulates old behavior thru get_property (safaridriver)");
  144. 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 (safaridriver)");
  145. }
  146. $input->clear();
  147. is($input->get_attribute('value'),'',"clear() works (safaridriver)");
  148. is(exception { $driver->button_down() },undef,"Can button down (safaridriver)");
  149. is(exception { $driver->button_up() },undef,"Can button up (safaridriver)");
  150. ok($driver->find_element('radio2','id')->is_selected(),"safaridriver is_selected() works");
  151. SKIP: {
  152. skip 'safari will not set_selected', 1;
  153. my $l1 = $driver->find_element('radio1','id');
  154. $l1->set_selected();
  155. $l1->set_selected();
  156. ok($l1->is_selected(),"safaridriver set_selected works");
  157. $l1->toggle();
  158. ok(!$l1->is_selected(),"safaridriver toggle works: off");
  159. $l1->toggle();
  160. ok($l1->is_selected(),"safaridriver toggle works: on");
  161. }
  162. my $l2 = $driver->find_element('hammertime','id');
  163. is( $l2->is_enabled(),0,"is_enabled works (safaridriver)");
  164. ok( $l2->get_element_location()->{x},"Can get element rect (safaridriver)");
  165. ok( $l2->get_size()->{'height'}, "Size shim on rect works (safaridriver)");
  166. is( $l2->get_tag_name(),'input',"get_tag_name works (safaridriver)");
  167. is( exception { $l2->get_element_location_in_view() }, undef, "get_element_location_in_view not available in safaridriver");
  168. is($driver->find_element('hidon','id')->is_displayed(),0,"is_displayed returns false for type=hidden elements");
  169. is($driver->find_element('no-see-em','id')->is_displayed(),0,"is_displayed returns false for display=none");
  170. like($driver->find_element('h1','tag_name')->get_text(),qr/Howdy Howdy Howdy/, "get_text works (safaridriver)");
  171. $driver->find_element('clickme','id')->click();
  172. is(exception { $driver->dismiss_alert() }, undef, "Can click element (safaridriver)");
  173. $driver->find_element('form','tag_name')->submit();
  174. sleep 5;
  175. like($driver->get_page_source(),qr/ZIPPY/,"elem submit() works (safaridriver)");
  176. #Pretty sure this one has enough 'inertia' to not disappear all the sudden
  177. $driver->get('http://w3.org/History.html');
  178. $driver->add_cookie('foo','bar','/','.w3.org',0,0,time()+5000);
  179. is(scalar(@{$driver->get_all_cookies()}),1,"can set cookie (safaridriver)");
  180. $driver->delete_cookie_named('foo');
  181. is(scalar(@{$driver->get_all_cookies()}),0,"can delete named cookies (safaridriver)");
  182. is(exception { $driver->quit() }, undef, "Can quit (safaridriver)");
  183. done_testing();