selenium-webdriver 4.22.0 → 4.24.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGES +15 -0
- data/Gemfile +1 -0
- data/bin/linux/selenium-manager +0 -0
- data/bin/macos/selenium-manager +0 -0
- data/bin/windows/selenium-manager.exe +0 -0
- data/lib/selenium/webdriver/atoms/findElements.js +1 -1
- data/lib/selenium/webdriver/atoms/getAttribute.js +2 -2
- data/lib/selenium/webdriver/atoms/isDisplayed.js +1 -1
- data/lib/selenium/webdriver/chromium/driver.rb +1 -0
- data/lib/selenium/webdriver/common/driver_extensions/has_fedcm_dialog.rb +55 -0
- data/lib/selenium/webdriver/common/error.rb +21 -21
- data/lib/selenium/webdriver/common/fedcm/account.rb +50 -0
- data/lib/selenium/webdriver/common/fedcm/dialog.rb +74 -0
- data/lib/selenium/webdriver/common/fedcm.rb +27 -0
- data/lib/selenium/webdriver/common.rb +3 -0
- data/lib/selenium/webdriver/remote/bridge/commands.rb +13 -1
- data/lib/selenium/webdriver/remote/bridge.rb +50 -0
- data/lib/selenium/webdriver/remote/http/curb.rb +11 -5
- data/lib/selenium/webdriver/remote/response.rb +8 -33
- data/lib/selenium/webdriver/remote.rb +1 -1
- data/lib/selenium/webdriver/version.rb +1 -1
- data/selenium-webdriver.gemspec +5 -5
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2161a57f3d5748a982e14296e5b2c75a436e575ec55cee48cc01a30c67b59b53
|
4
|
+
data.tar.gz: af9fcd5320f83492e41ab6b5f16350e828752b209028b7a4bf308aa82bc33b97
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0a7767af8bf0c7826e7c8aff74f9e860d3ca57766792cf3a030283ddaca423e999c18a1ee6eccbf32da8f21b197a95dc9bd51c0030b8635f2eb67bde48f02882
|
7
|
+
data.tar.gz: 81ee8d16f4f9ffbfbde921d2d2b71cfcc189f9e3062eb2602b01f7c9de90eff3b7a6855eb114c06a78b66412164d90a7fc80a2eaf5141da1d27e7478605e104f
|
data/CHANGES
CHANGED
@@ -1,3 +1,18 @@
|
|
1
|
+
4.24.0 (2024-08-23)
|
2
|
+
=========================
|
3
|
+
* Deprecate WebStorage JS methods (#14276)
|
4
|
+
* BUGFIX: Add stamp to nightly build (#14320)
|
5
|
+
* Add timeout and tests for curb, also added the gem curb that was not part of selenium (#14285)
|
6
|
+
* Add CDP for Chrome 128 and remove 125
|
7
|
+
|
8
|
+
4.23.0 (2024-07-18)
|
9
|
+
=========================
|
10
|
+
* Add FedCM support to the ruby selenium client (#13796)
|
11
|
+
* Add URLs constant to update error messages (#14174)
|
12
|
+
* Update selenium manager types (#14189)
|
13
|
+
* Add backtrace locations and cause to errors (#14170)
|
14
|
+
* Add CDP for Chrome 127 and remove 124
|
15
|
+
|
1
16
|
4.22.0 (2024-06-20)
|
2
17
|
=========================
|
3
18
|
|
data/Gemfile
CHANGED
@@ -5,5 +5,6 @@ Dir["#{__dir__}/*.gemspec"].each do |spec|
|
|
5
5
|
gemspec name: File.basename(spec, '.gemspec')
|
6
6
|
end
|
7
7
|
|
8
|
+
gem 'curb', '~> 1.0.5', require: false, platforms: %i[mri mingw x64_mingw]
|
8
9
|
gem 'debug', '~> 1.7', require: false, platforms: %i[mri mingw x64_mingw]
|
9
10
|
gem 'steep', '~> 1.5.0', require: false, platforms: %i[mri mingw x64_mingw]
|
data/bin/linux/selenium-manager
CHANGED
Binary file
|
data/bin/macos/selenium-manager
CHANGED
Binary file
|
Binary file
|
@@ -86,7 +86,7 @@ ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",green:"#0
|
|
86
86
|
lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370db",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",
|
87
87
|
moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#db7093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",
|
88
88
|
seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"};var Pc="backgroundColor borderTopColor borderRightColor borderBottomColor borderLeftColor color outlineColor".split(" "),Qc=/#([0-9a-fA-F])([0-9a-fA-F])([0-9a-fA-F])/,Rc=/^#(?:[0-9a-f]{3}){1,2}$/i,Sc=/^(?:rgba)?\((\d{1,3}),\s?(\d{1,3}),\s?(\d{1,3}),\s?(0|1|0\.\d*)\)$/i,Tc=/^(?:rgb)?\((0|[1-9]\d{0,2}),\s?(0|[1-9]\d{0,2}),\s?(0|[1-9]\d{0,2})\)$/i;function Uc(a,b){b=b.toLowerCase();return"style"==b?Vc(a.style.cssText):Lc&&"value"==b&&S(a,"INPUT")?a.value:Mc&&!0===a[b]?String(a.getAttribute(b)):(a=a.getAttributeNode(b))&&a.specified?a.value:null}var Wc=/[;]+(?=(?:(?:[^"]*"){2})*[^"]*$)(?=(?:(?:[^']*'){2})*[^']*$)(?=(?:[^()]*\([^()]*\))*[^()]*$)/;
|
89
|
-
function Vc(a){var b=[];l(a.split(Wc),function(c){var d=c.indexOf(":");0<d&&(c=[c.slice(0,d),c.slice(d+1)],2==c.length&&b.push(c[0].toLowerCase(),":",c[1],";"))});b=b.join("");return b=";"==b.charAt(b.length-1)?b:b+";"}function S(a,b){b&&"string"!==typeof b&&(b=b.toString());return
|
89
|
+
function Vc(a){var b=[];l(a.split(Wc),function(c){var d=c.indexOf(":");0<d&&(c=[c.slice(0,d),c.slice(d+1)],2==c.length&&b.push(c[0].toLowerCase(),":",c[1],";"))});b=b.join("");return b=";"==b.charAt(b.length-1)?b:b+";"}function S(a,b){b&&"string"!==typeof b&&(b=b.toString());return a instanceof HTMLFormElement?!!a&&1==a.nodeType&&(!b||"FORM"==b):!!a&&1==a.nodeType&&(!b||a.tagName.toUpperCase()==b)};function Xc(a,b,c,d){this.c=a;this.a=b;this.b=c;this.f=d}Xc.prototype.ceil=function(){this.c=Math.ceil(this.c);this.a=Math.ceil(this.a);this.b=Math.ceil(this.b);this.f=Math.ceil(this.f);return this};Xc.prototype.floor=function(){this.c=Math.floor(this.c);this.a=Math.floor(this.a);this.b=Math.floor(this.b);this.f=Math.floor(this.f);return this};Xc.prototype.round=function(){this.c=Math.round(this.c);this.a=Math.round(this.a);this.b=Math.round(this.b);this.f=Math.round(this.f);return this};function T(a,b,c,d){this.a=a;this.b=b;this.width=c;this.height=d}T.prototype.ceil=function(){this.a=Math.ceil(this.a);this.b=Math.ceil(this.b);this.width=Math.ceil(this.width);this.height=Math.ceil(this.height);return this};T.prototype.floor=function(){this.a=Math.floor(this.a);this.b=Math.floor(this.b);this.width=Math.floor(this.width);this.height=Math.floor(this.height);return this};
|
90
90
|
T.prototype.round=function(){this.a=Math.round(this.a);this.b=Math.round(this.b);this.width=Math.round(this.width);this.height=Math.round(this.height);return this};var Yc="function"===typeof ShadowRoot;function Zc(a){for(a=a.parentNode;a&&1!=a.nodeType&&9!=a.nodeType&&11!=a.nodeType;)a=a.parentNode;return S(a)?a:null}
|
91
91
|
function U(a,b){b=Ha(b);if("float"==b||"cssFloat"==b||"styleFloat"==b)b=Mc?"styleFloat":"cssFloat";a:{var c=b;var d=A(a);if(d.defaultView&&d.defaultView.getComputedStyle&&(d=d.defaultView.getComputedStyle(a,null))){c=d[c]||d.getPropertyValue(c)||"";break a}c=""}a=c||$c(a,b);if(null===a)a=null;else if(0<=oa(Pc,b)){b:{var e=a.match(Sc);if(e&&(b=Number(e[1]),c=Number(e[2]),d=Number(e[3]),e=Number(e[4]),0<=b&&255>=b&&0<=c&&255>=c&&0<=d&&255>=d&&0<=e&&1>=e)){b=[b,c,d,e];break b}b=null}if(!b)b:{if(d=a.match(Tc))if(b=
|
92
92
|
Number(d[1]),c=Number(d[2]),d=Number(d[3]),0<=b&&255>=b&&0<=c&&255>=c&&0<=d&&255>=d){b=[b,c,d,1];break b}b=null}if(!b)b:{b=a.toLowerCase();c=Oc[b.toLowerCase()];if(!c&&(c="#"==b.charAt(0)?b:"#"+b,4==c.length&&(c=c.replace(Qc,"#$1$1$2$2$3$3")),!Rc.test(c))){b=null;break b}b=[parseInt(c.substr(1,2),16),parseInt(c.substr(3,2),16),parseInt(c.substr(5,2),16),1]}a=b?"rgba("+b.join(", ")+")":a}return a}
|
@@ -1,6 +1,6 @@
|
|
1
1
|
function(){return (function(){var d=this||self;function f(a,b){function c(){}c.prototype=b.prototype;a.prototype=new c;a.prototype.constructor=a};var h=Array.prototype.indexOf?function(a,b){return Array.prototype.indexOf.call(a,b,void 0)}:function(a,b){if("string"===typeof a)return"string"!==typeof b||1!=b.length?-1:a.indexOf(b,0);for(var c=0;c<a.length;c++)if(c in a&&a[c]===b)return c;return-1},k=Array.prototype.forEach?function(a,b){Array.prototype.forEach.call(a,b,void 0)}:function(a,b){for(var c=a.length,e="string"===typeof a?a.split(""):a,g=0;g<c;g++)g in e&&b.call(void 0,e[g],g,a)};function l(a,b){this.code=a;this.a=m[a]||n;this.message=b||"";a=this.a.replace(/((?:^|\s+)[a-z])/g,function(c){return c.toUpperCase().replace(/^[\s\xa0]+/g,"")});b=a.length-5;if(0>b||a.indexOf("Error",b)!=b)a+="Error";this.name=a;a=Error(this.message);a.name=this.name;this.stack=a.stack||""}f(l,Error);var n="unknown error",m={15:"element not selectable",11:"element not visible"};m[31]=n;m[30]=n;m[24]="invalid cookie domain";m[29]="invalid element coordinates";m[12]="invalid element state";m[32]="invalid selector";
|
2
2
|
m[51]="invalid selector";m[52]="invalid selector";m[17]="javascript error";m[405]="unsupported operation";m[34]="move target out of bounds";m[27]="no such alert";m[7]="no such element";m[8]="no such frame";m[23]="no such window";m[28]="script timeout";m[33]="session not created";m[10]="stale element reference";m[21]="timeout";m[25]="unable to set cookie";m[26]="unexpected alert open";m[13]=n;m[9]="unknown command";var p;a:{var q=d.navigator;if(q){var r=q.userAgent;if(r){p=r;break a}}p=""}function t(a){return-1!=p.indexOf(a)};function u(){return t("Firefox")||t("FxiOS")}function v(){return(t("Chrome")||t("CriOS"))&&!t("Edge")};function w(){return t("iPhone")&&!t("iPod")&&!t("iPad")};var y=t("Opera"),z=t("Trident")||t("MSIE"),A=t("Edge"),B=t("Gecko")&&!(-1!=p.toLowerCase().indexOf("webkit")&&!t("Edge"))&&!(t("Trident")||t("MSIE"))&&!t("Edge"),C=-1!=p.toLowerCase().indexOf("webkit")&&!t("Edge");function D(){var a=d.document;return a?a.documentMode:void 0}var E;
|
3
3
|
a:{var F="",G=function(){var a=p;if(B)return/rv:([^\);]+)(\)|;)/.exec(a);if(A)return/Edge\/([\d\.]+)/.exec(a);if(z)return/\b(?:MSIE|rv)[: ]([^\);]+)(\)|;)/.exec(a);if(C)return/WebKit\/(\S+)/.exec(a);if(y)return/(?:Version)[ \/]?(\S+)/.exec(a)}();G&&(F=G?G[1]:"");if(z){var H=D();if(null!=H&&H>parseFloat(F)){E=String(H);break a}}E=F}var I;I=d.document&&z?D():void 0;var J=u(),K=w()||t("iPod"),L=t("iPad"),M=t("Android")&&!(v()||u()||t("Opera")||t("Silk")),N=v(),aa=t("Safari")&&!(v()||t("Coast")||t("Opera")||t("Edge")||t("Edg/")||t("OPR")||u()||t("Silk")||t("Android"))&&!(w()||t("iPad")||t("iPod"));function O(a){return(a=a.exec(p))?a[1]:""}(function(){if(J)return O(/Firefox\/([0-9.]+)/);if(z||A||y)return E;if(N)return w()||t("iPad")||t("iPod")?O(/CriOS\/([0-9.]+)/):O(/Chrome\/([0-9.]+)/);if(aa&&!(w()||t("iPad")||t("iPod")))return O(/Version\/([0-9.]+)/);if(K||L){var a=/Version\/(\S+).*Mobile\/(\S+)/.exec(p);if(a)return a[1]+"."+a[2]}else if(M)return(a=O(/Android\s+([0-9.]+)/))?a:O(/Version\/([0-9.]+)/);return""})();var P=z&&!(8<=Number(I)),ba=z&&!(9<=Number(I));var ca={SCRIPT:1,STYLE:1,HEAD:1,IFRAME:1,OBJECT:1},Q={IMG:" ",BR:"\n"};function R(a,b,c){if(!(a.nodeName in ca))if(3==a.nodeType)c?b.push(String(a.nodeValue).replace(/(\r\n|\r|\n)/g,"")):b.push(a.nodeValue);else if(a.nodeName in Q)b.push(Q[a.nodeName]);else for(a=a.firstChild;a;)R(a,b,c),a=a.nextSibling};function S(a,b){b=b.toLowerCase();return"style"==b?da(a.style.cssText):P&&"value"==b&&T(a,"INPUT")?a.value:ba&&!0===a[b]?String(a.getAttribute(b)):(a=a.getAttributeNode(b))&&a.specified?a.value:null}var ea=/[;]+(?=(?:(?:[^"]*"){2})*[^"]*$)(?=(?:(?:[^']*'){2})*[^']*$)(?=(?:[^()]*\([^()]*\))*[^()]*$)/;
|
4
|
-
function da(a){var b=[];k(a.split(ea),function(c){var e=c.indexOf(":");0<e&&(c=[c.slice(0,e),c.slice(e+1)],2==c.length&&b.push(c[0].toLowerCase(),":",c[1],";"))});b=b.join("");return b=";"==b.charAt(b.length-1)?b:b+";"}function U(a,b){P&&"value"==b&&T(a,"OPTION")&&null===S(a,"value")?(b=[],R(a,b,!1),a=b.join("")):a=a[b];return a}
|
5
|
-
function V(a){return T(a,"OPTION")?!0:T(a,"INPUT")?(a=a.type.toLowerCase(),"checkbox"==a||"radio"==a):!1};var fa={"class":"className",readonly:"readOnly"},ha="allowfullscreen allowpaymentrequest allowusermedia async autofocus autoplay checked compact complete controls declare default defaultchecked defaultselected defer disabled ended formnovalidate hidden indeterminate iscontenteditable ismap itemscope loop multiple muted nohref nomodule noresize noshade novalidate nowrap open paused playsinline pubdate readonly required reversed scoped seamless seeking selected truespeed typemustmatch willvalidate".split(" ");function W(a,b){var c=null,e=b.toLowerCase();if("style"==e)return(c=a.style)&&"string"!=typeof c&&(c=c.cssText),c;if(("selected"==e||"checked"==e)&&V(a)){if(!V(a))throw new l(15,"Element is not selectable");b="selected";c=a.type&&a.type.toLowerCase();if("checkbox"==c||"radio"==c)b="checked";return U(a,b)?"true":null}var g=T(a,"A");if(T(a,"IMG")&&"src"==e||g&&"href"==e)return(c=S(a,e))&&(c=U(a,e)),c;if("spellcheck"==e){c=S(a,e);if(null!==c){if("false"==c.toLowerCase())return"false";if("true"==c.toLowerCase())return"true"}return U(a,
|
4
|
+
function da(a){var b=[];k(a.split(ea),function(c){var e=c.indexOf(":");0<e&&(c=[c.slice(0,e),c.slice(e+1)],2==c.length&&b.push(c[0].toLowerCase(),":",c[1],";"))});b=b.join("");return b=";"==b.charAt(b.length-1)?b:b+";"}function U(a,b){P&&"value"==b&&T(a,"OPTION")&&null===S(a,"value")?(b=[],R(a,b,!1),a=b.join("")):a=a[b];return a}
|
5
|
+
function T(a,b){b&&"string"!==typeof b&&(b=b.toString());return a instanceof HTMLFormElement?!!a&&1==a.nodeType&&(!b||"FORM"==b):!!a&&1==a.nodeType&&(!b||a.tagName.toUpperCase()==b)}function V(a){return T(a,"OPTION")?!0:T(a,"INPUT")?(a=a.type.toLowerCase(),"checkbox"==a||"radio"==a):!1};var fa={"class":"className",readonly:"readOnly"},ha="allowfullscreen allowpaymentrequest allowusermedia async autofocus autoplay checked compact complete controls declare default defaultchecked defaultselected defer disabled ended formnovalidate hidden indeterminate iscontenteditable ismap itemscope loop multiple muted nohref nomodule noresize noshade novalidate nowrap open paused playsinline pubdate readonly required reversed scoped seamless seeking selected truespeed typemustmatch willvalidate".split(" ");function W(a,b){var c=null,e=b.toLowerCase();if("style"==e)return(c=a.style)&&"string"!=typeof c&&(c=c.cssText),c;if(("selected"==e||"checked"==e)&&V(a)){if(!V(a))throw new l(15,"Element is not selectable");b="selected";c=a.type&&a.type.toLowerCase();if("checkbox"==c||"radio"==c)b="checked";return U(a,b)?"true":null}var g=T(a,"A");if(T(a,"IMG")&&"src"==e||g&&"href"==e)return(c=S(a,e))&&(c=U(a,e)),c;if("spellcheck"==e){c=S(a,e);if(null!==c){if("false"==c.toLowerCase())return"false";if("true"==c.toLowerCase())return"true"}return U(a,
|
6
6
|
e)+""}g=fa[b]||b;if(0<=h(ha,e))return(c=null!==S(a,b)||U(a,g))?"true":null;try{var x=U(a,g)}catch(ia){}(e=null==x)||(e=typeof x,e="object"==e&&null!=x||"function"==e);e?c=S(a,b):c=x;return null!=c?c.toString():null}var X=["_"],Y=d;X[0]in Y||"undefined"==typeof Y.execScript||Y.execScript("var "+X[0]);for(var Z;X.length&&(Z=X.shift());)X.length||void 0===W?Y[Z]&&Y[Z]!==Object.prototype[Z]?Y=Y[Z]:Y=Y[Z]={}:Y[Z]=W;; return this._.apply(null,arguments);}).apply({navigator:typeof window!='undefined'?window.navigator:null,document:typeof window!='undefined'?window.document:null}, arguments);}
|
@@ -9,7 +9,7 @@ moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:
|
|
9
9
|
seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"};var ia="backgroundColor borderTopColor borderRightColor borderBottomColor borderLeftColor color outlineColor".split(" "),ja=/#([0-9a-fA-F])([0-9a-fA-F])([0-9a-fA-F])/,ka=/^#(?:[0-9a-f]{3}){1,2}$/i,la=/^(?:rgba)?\((\d{1,3}),\s?(\d{1,3}),\s?(\d{1,3}),\s?(0|1|0\.\d*)\)$/i,ma=/^(?:rgb)?\((0|[1-9]\d{0,2}),\s?(0|[1-9]\d{0,2}),\s?(0|[1-9]\d{0,2})\)$/i;function m(a,b){this.code=a;this.a=p[a]||r;this.message=b||"";a=this.a.replace(/((?:^|\s+)[a-z])/g,function(c){return c.toUpperCase().replace(/^[\s\xa0]+/g,"")});b=a.length-5;if(0>b||a.indexOf("Error",b)!=b)a+="Error";this.name=a;a=Error(this.message);a.name=this.name;this.stack=a.stack||""}ca(m,Error);var r="unknown error",p={15:"element not selectable",11:"element not visible"};p[31]=r;p[30]=r;p[24]="invalid cookie domain";p[29]="invalid element coordinates";p[12]="invalid element state";
|
10
10
|
p[32]="invalid selector";p[51]="invalid selector";p[52]="invalid selector";p[17]="javascript error";p[405]="unsupported operation";p[34]="move target out of bounds";p[27]="no such alert";p[7]="no such element";p[8]="no such frame";p[23]="no such window";p[28]="script timeout";p[33]="session not created";p[10]="stale element reference";p[21]="timeout";p[25]="unable to set cookie";p[26]="unexpected alert open";p[13]=r;p[9]="unknown command";var u=String.prototype.trim?function(a){return a.trim()}:function(a){return/^[\s\xa0]*([\s\S]*?)[\s\xa0]*$/.exec(a)[1]};
|
11
11
|
function na(a,b){var c=0;a=u(String(a)).split(".");b=u(String(b)).split(".");for(var e=Math.max(a.length,b.length),d=0;0==c&&d<e;d++){var f=a[d]||"",h=b[d]||"";do{f=/(\d*)(\D*)(.*)/.exec(f)||["","","",""];h=/(\d*)(\D*)(.*)/.exec(h)||["","","",""];if(0==f[0].length&&0==h[0].length)break;c=v(0==f[1].length?0:parseInt(f[1],10),0==h[1].length?0:parseInt(h[1],10))||v(0==f[2].length,0==h[2].length)||v(f[2],h[2]);f=f[3];h=h[3]}while(0==c)}return c}function v(a,b){return a<b?-1:a>b?1:0};var w;a:{var oa=g.navigator;if(oa){var sa=oa.userAgent;if(sa){w=sa;break a}}w=""}function x(a){return-1!=w.indexOf(a)};function y(){return x("Firefox")||x("FxiOS")}function A(){return(x("Chrome")||x("CriOS"))&&!x("Edge")};function ta(a){return String(a).replace(/\-([a-z])/g,function(b,c){return c.toUpperCase()})};function B(){return x("iPhone")&&!x("iPod")&&!x("iPad")};function ua(a,b){var c=va;return Object.prototype.hasOwnProperty.call(c,a)?c[a]:c[a]=b(a)};var wa=x("Opera"),C=x("Trident")||x("MSIE"),xa=x("Edge"),ya=x("Gecko")&&!(-1!=w.toLowerCase().indexOf("webkit")&&!x("Edge"))&&!(x("Trident")||x("MSIE"))&&!x("Edge"),za=-1!=w.toLowerCase().indexOf("webkit")&&!x("Edge");function Aa(){var a=g.document;return a?a.documentMode:void 0}var E;
|
12
|
-
a:{var F="",G=function(){var a=w;if(ya)return/rv:([^\);]+)(\)|;)/.exec(a);if(xa)return/Edge\/([\d\.]+)/.exec(a);if(C)return/\b(?:MSIE|rv)[: ]([^\);]+)(\)|;)/.exec(a);if(za)return/WebKit\/(\S+)/.exec(a);if(wa)return/(?:Version)[ \/]?(\S+)/.exec(a)}();G&&(F=G?G[1]:"");if(C){var H=Aa();if(null!=H&&H>parseFloat(F)){E=String(H);break a}}E=F}var va={};function Ba(a){return ua(a,function(){return 0<=na(E,a)})}var I;I=g.document&&C?Aa():void 0;var Ca=y(),Da=B()||x("iPod"),Ea=x("iPad"),Fa=x("Android")&&!(A()||y()||x("Opera")||x("Silk")),Ga=A(),Ha=x("Safari")&&!(A()||x("Coast")||x("Opera")||x("Edge")||x("Edg/")||x("OPR")||y()||x("Silk")||x("Android"))&&!(B()||x("iPad")||x("iPod"));function J(a){return(a=a.exec(w))?a[1]:""}(function(){if(Ca)return J(/Firefox\/([0-9.]+)/);if(C||xa||wa)return E;if(Ga)return B()||x("iPad")||x("iPod")?J(/CriOS\/([0-9.]+)/):J(/Chrome\/([0-9.]+)/);if(Ha&&!(B()||x("iPad")||x("iPod")))return J(/Version\/([0-9.]+)/);if(Da||Ea){var a=/Version\/(\S+).*Mobile\/(\S+)/.exec(w);if(a)return a[1]+"."+a[2]}else if(Fa)return(a=J(/Android\s+([0-9.]+)/))?a:J(/Version\/([0-9.]+)/);return""})();var K;if(K=C)K=!(9<=Number(I));var Ia=K;function L(a,b){this.x=void 0!==a?a:0;this.y=void 0!==b?b:0}L.prototype.ceil=function(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);return this};L.prototype.floor=function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);return this};L.prototype.round=function(){this.x=Math.round(this.x);this.y=Math.round(this.y);return this};function M(a,b){this.width=a;this.height=b}M.prototype.aspectRatio=function(){return this.width/this.height};M.prototype.ceil=function(){this.width=Math.ceil(this.width);this.height=Math.ceil(this.height);return this};M.prototype.floor=function(){this.width=Math.floor(this.width);this.height=Math.floor(this.height);return this};M.prototype.round=function(){this.width=Math.round(this.width);this.height=Math.round(this.height);return this};function N(a){return 9==a.nodeType?a:a.ownerDocument||a.document}function Ja(a,b){a&&(a=a.parentNode);for(var c=0;a;){if(b(a))return a;a=a.parentNode;c++}return null}function Ka(a){this.a=a||g.document||document};function P(a,b){b&&"string"!==typeof b&&(b=b.toString());return
|
12
|
+
a:{var F="",G=function(){var a=w;if(ya)return/rv:([^\);]+)(\)|;)/.exec(a);if(xa)return/Edge\/([\d\.]+)/.exec(a);if(C)return/\b(?:MSIE|rv)[: ]([^\);]+)(\)|;)/.exec(a);if(za)return/WebKit\/(\S+)/.exec(a);if(wa)return/(?:Version)[ \/]?(\S+)/.exec(a)}();G&&(F=G?G[1]:"");if(C){var H=Aa();if(null!=H&&H>parseFloat(F)){E=String(H);break a}}E=F}var va={};function Ba(a){return ua(a,function(){return 0<=na(E,a)})}var I;I=g.document&&C?Aa():void 0;var Ca=y(),Da=B()||x("iPod"),Ea=x("iPad"),Fa=x("Android")&&!(A()||y()||x("Opera")||x("Silk")),Ga=A(),Ha=x("Safari")&&!(A()||x("Coast")||x("Opera")||x("Edge")||x("Edg/")||x("OPR")||y()||x("Silk")||x("Android"))&&!(B()||x("iPad")||x("iPod"));function J(a){return(a=a.exec(w))?a[1]:""}(function(){if(Ca)return J(/Firefox\/([0-9.]+)/);if(C||xa||wa)return E;if(Ga)return B()||x("iPad")||x("iPod")?J(/CriOS\/([0-9.]+)/):J(/Chrome\/([0-9.]+)/);if(Ha&&!(B()||x("iPad")||x("iPod")))return J(/Version\/([0-9.]+)/);if(Da||Ea){var a=/Version\/(\S+).*Mobile\/(\S+)/.exec(w);if(a)return a[1]+"."+a[2]}else if(Fa)return(a=J(/Android\s+([0-9.]+)/))?a:J(/Version\/([0-9.]+)/);return""})();var K;if(K=C)K=!(9<=Number(I));var Ia=K;function L(a,b){this.x=void 0!==a?a:0;this.y=void 0!==b?b:0}L.prototype.ceil=function(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);return this};L.prototype.floor=function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);return this};L.prototype.round=function(){this.x=Math.round(this.x);this.y=Math.round(this.y);return this};function M(a,b){this.width=a;this.height=b}M.prototype.aspectRatio=function(){return this.width/this.height};M.prototype.ceil=function(){this.width=Math.ceil(this.width);this.height=Math.ceil(this.height);return this};M.prototype.floor=function(){this.width=Math.floor(this.width);this.height=Math.floor(this.height);return this};M.prototype.round=function(){this.width=Math.round(this.width);this.height=Math.round(this.height);return this};function N(a){return 9==a.nodeType?a:a.ownerDocument||a.document}function Ja(a,b){a&&(a=a.parentNode);for(var c=0;a;){if(b(a))return a;a=a.parentNode;c++}return null}function Ka(a){this.a=a||g.document||document};function P(a,b){b&&"string"!==typeof b&&(b=b.toString());return a instanceof HTMLFormElement?!!a&&1==a.nodeType&&(!b||"FORM"==b):!!a&&1==a.nodeType&&(!b||a.tagName.toUpperCase()==b)};function Q(a,b,c,e){this.f=a;this.a=b;this.b=c;this.c=e}Q.prototype.ceil=function(){this.f=Math.ceil(this.f);this.a=Math.ceil(this.a);this.b=Math.ceil(this.b);this.c=Math.ceil(this.c);return this};Q.prototype.floor=function(){this.f=Math.floor(this.f);this.a=Math.floor(this.a);this.b=Math.floor(this.b);this.c=Math.floor(this.c);return this};Q.prototype.round=function(){this.f=Math.round(this.f);this.a=Math.round(this.a);this.b=Math.round(this.b);this.c=Math.round(this.c);return this};function R(a,b,c,e){this.a=a;this.b=b;this.width=c;this.height=e}R.prototype.ceil=function(){this.a=Math.ceil(this.a);this.b=Math.ceil(this.b);this.width=Math.ceil(this.width);this.height=Math.ceil(this.height);return this};R.prototype.floor=function(){this.a=Math.floor(this.a);this.b=Math.floor(this.b);this.width=Math.floor(this.width);this.height=Math.floor(this.height);return this};
|
13
13
|
R.prototype.round=function(){this.a=Math.round(this.a);this.b=Math.round(this.b);this.width=Math.round(this.width);this.height=Math.round(this.height);return this};var La="function"===typeof ShadowRoot;function S(a){for(a=a.parentNode;a&&1!=a.nodeType&&9!=a.nodeType&&11!=a.nodeType;)a=a.parentNode;return P(a)?a:null}
|
14
14
|
function T(a,b){b=ta(b);if("float"==b||"cssFloat"==b||"styleFloat"==b)b=Ia?"styleFloat":"cssFloat";a:{var c=b;var e=N(a);if(e.defaultView&&e.defaultView.getComputedStyle&&(e=e.defaultView.getComputedStyle(a,null))){c=e[c]||e.getPropertyValue(c)||"";break a}c=""}a=c||Ma(a,b);if(null===a)a=null;else if(0<=da(ia,b)){b:{var d=a.match(la);if(d&&(b=Number(d[1]),c=Number(d[2]),e=Number(d[3]),d=Number(d[4]),0<=b&&255>=b&&0<=c&&255>=c&&0<=e&&255>=e&&0<=d&&1>=d)){b=[b,c,e,d];break b}b=null}if(!b)b:{if(e=a.match(ma))if(b=
|
15
15
|
Number(e[1]),c=Number(e[2]),e=Number(e[3]),0<=b&&255>=b&&0<=c&&255>=c&&0<=e&&255>=e){b=[b,c,e,1];break b}b=null}if(!b)b:{b=a.toLowerCase();c=ha[b.toLowerCase()];if(!c&&(c="#"==b.charAt(0)?b:"#"+b,4==c.length&&(c=c.replace(ja,"#$1$1$2$2$3$3")),!ka.test(c))){b=null;break b}b=[parseInt(c.substr(1,2),16),parseInt(c.substr(3,2),16),parseInt(c.substr(5,2),16),1]}a=b?"rgba("+b.join(", ")+")":a}return a}
|
@@ -29,6 +29,7 @@ module Selenium
|
|
29
29
|
EXTENSIONS = [DriverExtensions::HasCDP,
|
30
30
|
DriverExtensions::HasBiDi,
|
31
31
|
DriverExtensions::HasCasting,
|
32
|
+
DriverExtensions::HasFedCmDialog,
|
32
33
|
DriverExtensions::HasNetworkConditions,
|
33
34
|
DriverExtensions::HasNetworkInterception,
|
34
35
|
DriverExtensions::HasWebStorage,
|
@@ -0,0 +1,55 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Licensed to the Software Freedom Conservancy (SFC) under one
|
4
|
+
# or more contributor license agreements. See the NOTICE file
|
5
|
+
# distributed with this work for additional information
|
6
|
+
# regarding copyright ownership. The SFC licenses this file
|
7
|
+
# to you under the Apache License, Version 2.0 (the
|
8
|
+
# "License"); you may not use this file except in compliance
|
9
|
+
# with the License. You may obtain a copy of the License at
|
10
|
+
#
|
11
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
12
|
+
#
|
13
|
+
# Unless required by applicable law or agreed to in writing,
|
14
|
+
# software distributed under the License is distributed on an
|
15
|
+
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
16
|
+
# KIND, either express or implied. See the License for the
|
17
|
+
# specific language governing permissions and limitations
|
18
|
+
# under the License.
|
19
|
+
|
20
|
+
module Selenium
|
21
|
+
module WebDriver
|
22
|
+
module DriverExtensions
|
23
|
+
module HasFedCmDialog
|
24
|
+
# Disables the promise rejection delay for FedCm.
|
25
|
+
#
|
26
|
+
# FedCm by default delays promise resolution in failure cases for privacy reasons.
|
27
|
+
# This method allows turning it off to let tests run faster where this is not relevant.
|
28
|
+
def enable_fedcm_delay=(enable)
|
29
|
+
@bridge.fedcm_delay(enable)
|
30
|
+
end
|
31
|
+
|
32
|
+
# Resets the FedCm dialog cooldown.
|
33
|
+
#
|
34
|
+
# If a user agent triggers a cooldown when the account chooser is dismissed,
|
35
|
+
# this method resets that cooldown so that the dialog can be triggered again immediately.
|
36
|
+
def reset_fedcm_cooldown
|
37
|
+
@bridge.reset_fedcm_cooldown
|
38
|
+
end
|
39
|
+
|
40
|
+
def fedcm_dialog
|
41
|
+
@fedcm_dialog ||= FedCM::Dialog.new(@bridge)
|
42
|
+
end
|
43
|
+
|
44
|
+
def wait_for_fedcm_dialog(timeout: 5, interval: 0.2, message: nil, ignore: nil)
|
45
|
+
wait = Wait.new(timeout: timeout, interval: interval, message: message, ignore: ignore)
|
46
|
+
wait.until do
|
47
|
+
fedcm_dialog if fedcm_dialog.type
|
48
|
+
rescue Error::NoSuchAlertError
|
49
|
+
nil
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end # HasFedCmDialog
|
53
|
+
end # DriverExtensions
|
54
|
+
end # WebDriver
|
55
|
+
end # Selenium
|
@@ -37,17 +37,29 @@ module Selenium
|
|
37
37
|
SUPPORT_MSG = 'For documentation on this error, please visit:'
|
38
38
|
ERROR_URL = 'https://www.selenium.dev/documentation/webdriver/troubleshooting/errors'
|
39
39
|
|
40
|
-
|
40
|
+
URLS = {
|
41
|
+
NoSuchElementError: "#{ERROR_URL}#no-such-element-exception",
|
42
|
+
StaleElementReferenceError: "#{ERROR_URL}#stale-element-reference-exception",
|
43
|
+
InvalidSelectorError: "#{ERROR_URL}#invalid-selector-exception",
|
44
|
+
NoSuchDriverError: "#{ERROR_URL}/driver_location"
|
45
|
+
}.freeze
|
46
|
+
|
47
|
+
class WebDriverError < StandardError
|
48
|
+
def initialize(msg = '')
|
49
|
+
# Remove this conditional when all the error pages have been documented
|
50
|
+
super(URLS[class_name] ? "#{msg}; #{SUPPORT_MSG} #{URLS[class_name]}" : msg)
|
51
|
+
end
|
52
|
+
|
53
|
+
def class_name
|
54
|
+
self.class.name&.split('::')&.last&.to_sym
|
55
|
+
end
|
56
|
+
end
|
41
57
|
|
42
58
|
#
|
43
59
|
# An element could not be located on the page using the given search parameters.
|
44
60
|
#
|
45
61
|
|
46
|
-
class NoSuchElementError < WebDriverError
|
47
|
-
def initialize(msg = '')
|
48
|
-
super("#{msg}; #{SUPPORT_MSG} #{ERROR_URL}#no-such-element-exception")
|
49
|
-
end
|
50
|
-
end
|
62
|
+
class NoSuchElementError < WebDriverError; end
|
51
63
|
|
52
64
|
#
|
53
65
|
# A command to switch to a frame could not be satisfied because the frame could not be found.
|
@@ -65,11 +77,7 @@ module Selenium
|
|
65
77
|
# A command failed because the referenced element is no longer attached to the DOM.
|
66
78
|
#
|
67
79
|
|
68
|
-
class StaleElementReferenceError < WebDriverError
|
69
|
-
def initialize(msg = '')
|
70
|
-
super("#{msg}; #{SUPPORT_MSG} #{ERROR_URL}#stale-element-reference-exception")
|
71
|
-
end
|
72
|
-
end
|
80
|
+
class StaleElementReferenceError < WebDriverError; end
|
73
81
|
|
74
82
|
#
|
75
83
|
# A command failed because the referenced shadow root is no longer attached to the DOM.
|
@@ -143,11 +151,7 @@ module Selenium
|
|
143
151
|
# Argument was an invalid selector.
|
144
152
|
#
|
145
153
|
|
146
|
-
class InvalidSelectorError < WebDriverError
|
147
|
-
def initialize(msg = '')
|
148
|
-
super("#{msg}; #{SUPPORT_MSG} #{ERROR_URL}#invalid-selector-exception")
|
149
|
-
end
|
150
|
-
end
|
154
|
+
class InvalidSelectorError < WebDriverError; end
|
151
155
|
|
152
156
|
#
|
153
157
|
# A new session could not be created.
|
@@ -232,11 +236,7 @@ module Selenium
|
|
232
236
|
# Indicates that driver was not specified and could not be located.
|
233
237
|
#
|
234
238
|
|
235
|
-
class NoSuchDriverError < WebDriverError
|
236
|
-
def initialize(msg = '')
|
237
|
-
super("#{msg}; #{SUPPORT_MSG} #{ERROR_URL}/driver_location")
|
238
|
-
end
|
239
|
-
end
|
239
|
+
class NoSuchDriverError < WebDriverError; end
|
240
240
|
end # Error
|
241
241
|
end # WebDriver
|
242
242
|
end # Selenium
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Licensed to the Software Freedom Conservancy (SFC) under one
|
4
|
+
# or more contributor license agreements. See the NOTICE file
|
5
|
+
# distributed with this work for additional information
|
6
|
+
# regarding copyright ownership. The SFC licenses this file
|
7
|
+
# to you under the Apache License, Version 2.0 (the
|
8
|
+
# "License"); you may not use this file except in compliance
|
9
|
+
# with the License. You may obtain a copy of the License at
|
10
|
+
#
|
11
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
12
|
+
#
|
13
|
+
# Unless required by applicable law or agreed to in writing,
|
14
|
+
# software distributed under the License is distributed on an
|
15
|
+
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
16
|
+
# KIND, either express or implied. See the License for the
|
17
|
+
# specific language governing permissions and limitations
|
18
|
+
# under the License.
|
19
|
+
|
20
|
+
module Selenium
|
21
|
+
module WebDriver
|
22
|
+
module FedCM
|
23
|
+
# Represents an account displayed in a FedCm account list.
|
24
|
+
# See: https://fedidcg.github.io/FedCM/#dictdef-identityprovideraccount
|
25
|
+
# https://fedidcg.github.io/FedCM/#webdriver-accountlist
|
26
|
+
class Account
|
27
|
+
LOGIN_STATE_SIGNIN = 'SignIn'
|
28
|
+
LOGIN_STATE_SIGNUP = 'SignUp'
|
29
|
+
|
30
|
+
attr_reader :account_id, :email, :name, :given_name, :picture_url,
|
31
|
+
:idp_config_url, :login_state, :terms_of_service_url, :privacy_policy_url
|
32
|
+
|
33
|
+
# Initializes a new account with the provided attributes.
|
34
|
+
#
|
35
|
+
# @param [Hash]
|
36
|
+
def initialize(**args)
|
37
|
+
@account_id = args['accountId']
|
38
|
+
@email = args['email']
|
39
|
+
@name = args['name']
|
40
|
+
@given_name = args['givenName']
|
41
|
+
@picture_url = args['pictureUrl']
|
42
|
+
@idp_config_url = args['idpConfigUrl']
|
43
|
+
@login_state = args['loginState']
|
44
|
+
@terms_of_service_url = args['termsOfServiceUrl']
|
45
|
+
@privacy_policy_url = args['privacyPolicyUrl']
|
46
|
+
end
|
47
|
+
end # Account
|
48
|
+
end # FedCM
|
49
|
+
end # WebDriver
|
50
|
+
end # Selenium
|
@@ -0,0 +1,74 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Licensed to the Software Freedom Conservancy (SFC) under one
|
4
|
+
# or more contributor license agreements. See the NOTICE file
|
5
|
+
# distributed with this work for additional information
|
6
|
+
# regarding copyright ownership. The SFC licenses this file
|
7
|
+
# to you under the Apache License, Version 2.0 (the
|
8
|
+
# "License"); you may not use this file except in compliance
|
9
|
+
# with the License. You may obtain a copy of the License at
|
10
|
+
#
|
11
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
12
|
+
#
|
13
|
+
# Unless required by applicable law or agreed to in writing,
|
14
|
+
# software distributed under the License is distributed on an
|
15
|
+
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
16
|
+
# KIND, either express or implied. See the License for the
|
17
|
+
# specific language governing permissions and limitations
|
18
|
+
# under the License.
|
19
|
+
|
20
|
+
module Selenium
|
21
|
+
module WebDriver
|
22
|
+
module FedCM
|
23
|
+
class Dialog
|
24
|
+
def initialize(bridge)
|
25
|
+
@bridge = bridge
|
26
|
+
end
|
27
|
+
|
28
|
+
DIALOG_TYPE_ACCOUNT_LIST = 'AccountChooser'
|
29
|
+
DIALOG_TYPE_AUTO_REAUTH = 'AutoReauthn'
|
30
|
+
|
31
|
+
# Closes the dialog as if the user had clicked X.
|
32
|
+
def click
|
33
|
+
@bridge.click_fedcm_dialog_button
|
34
|
+
end
|
35
|
+
|
36
|
+
# Closes the dialog as if the user had clicked X.
|
37
|
+
def cancel
|
38
|
+
@bridge.cancel_fedcm_dialog
|
39
|
+
end
|
40
|
+
|
41
|
+
# Selects an account as if the user had clicked on it.
|
42
|
+
#
|
43
|
+
# @param [Integer] index The index of the account to select from the list returned by get_accounts.
|
44
|
+
def select_account(index)
|
45
|
+
@bridge.select_fedcm_account index
|
46
|
+
end
|
47
|
+
|
48
|
+
# Returns the type of the open dialog.
|
49
|
+
#
|
50
|
+
# One of DIALOG_TYPE_ACCOUNT_LIST and DIALOG_TYPE_AUTO_REAUTH.
|
51
|
+
def type
|
52
|
+
@bridge.fedcm_dialog_type
|
53
|
+
end
|
54
|
+
|
55
|
+
# Returns the title of the dialog.
|
56
|
+
def title
|
57
|
+
@bridge.fedcm_title
|
58
|
+
end
|
59
|
+
|
60
|
+
# Returns the subtitle of the dialog or nil if none.
|
61
|
+
def subtitle
|
62
|
+
@bridge.fedcm_subtitle
|
63
|
+
end
|
64
|
+
|
65
|
+
# Returns the accounts shown in the account chooser.
|
66
|
+
#
|
67
|
+
# If this is an auto reauth dialog, returns the single account that is being signed in.
|
68
|
+
def accounts
|
69
|
+
@bridge.fedcm_account_list.map { |account| Account.new(**account) }
|
70
|
+
end
|
71
|
+
end # Dialog
|
72
|
+
end # FedCM
|
73
|
+
end # WebDriver
|
74
|
+
end # Selenium
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Licensed to the Software Freedom Conservancy (SFC) under one
|
4
|
+
# or more contributor license agreements. See the NOTICE file
|
5
|
+
# distributed with this work for additional information
|
6
|
+
# regarding copyright ownership. The SFC licenses this file
|
7
|
+
# to you under the Apache License, Version 2.0 (the
|
8
|
+
# "License"); you may not use this file except in compliance
|
9
|
+
# with the License. You may obtain a copy of the License at
|
10
|
+
#
|
11
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
12
|
+
#
|
13
|
+
# Unless required by applicable law or agreed to in writing,
|
14
|
+
# software distributed under the License is distributed on an
|
15
|
+
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
16
|
+
# KIND, either express or implied. See the License for the
|
17
|
+
# specific language governing permissions and limitations
|
18
|
+
# under the License.
|
19
|
+
|
20
|
+
module Selenium
|
21
|
+
module WebDriver
|
22
|
+
module FedCM
|
23
|
+
autoload :Account, 'fedcm/account'
|
24
|
+
autoload :Dialog, 'fedcm/dialog'
|
25
|
+
end # FedCM
|
26
|
+
end # WebDriver
|
27
|
+
end # Selenium
|
@@ -89,6 +89,7 @@ require 'selenium/webdriver/common/driver_extensions/has_pinned_scripts'
|
|
89
89
|
require 'selenium/webdriver/common/driver_extensions/has_cdp'
|
90
90
|
require 'selenium/webdriver/common/driver_extensions/has_casting'
|
91
91
|
require 'selenium/webdriver/common/driver_extensions/has_launching'
|
92
|
+
require 'selenium/webdriver/common/driver_extensions/has_fedcm_dialog'
|
92
93
|
require 'selenium/webdriver/common/keys'
|
93
94
|
require 'selenium/webdriver/common/profile_helper'
|
94
95
|
require 'selenium/webdriver/common/options'
|
@@ -99,3 +100,5 @@ require 'selenium/webdriver/common/shadow_root'
|
|
99
100
|
require 'selenium/webdriver/common/websocket_connection'
|
100
101
|
require 'selenium/webdriver/common/child_process'
|
101
102
|
require 'selenium/webdriver/common/script'
|
103
|
+
require 'selenium/webdriver/common/fedcm/account'
|
104
|
+
require 'selenium/webdriver/common/fedcm/dialog'
|
@@ -155,8 +155,20 @@ module Selenium
|
|
155
155
|
remove_credential: [:delete,
|
156
156
|
'session/:session_id/webauthn/authenticator/:authenticatorId/credentials/:credentialId'],
|
157
157
|
remove_all_credentials: [:delete, 'session/:session_id/webauthn/authenticator/:authenticatorId/credentials'],
|
158
|
-
set_user_verified: [:post, 'session/:session_id/webauthn/authenticator/:authenticatorId/uv']
|
158
|
+
set_user_verified: [:post, 'session/:session_id/webauthn/authenticator/:authenticatorId/uv'],
|
159
159
|
|
160
|
+
#
|
161
|
+
# federated-credential management
|
162
|
+
#
|
163
|
+
|
164
|
+
get_fedcm_title: [:get, 'session/:session_id/fedcm/gettitle'],
|
165
|
+
get_fedcm_dialog_type: [:get, 'session/:session_id/fedcm/getdialogtype'],
|
166
|
+
get_fedcm_account_list: [:get, 'session/:session_id/fedcm/accountlist'],
|
167
|
+
click_fedcm_dialog_button: [:post, 'session/:session_id/fedcm/clickdialogbutton'],
|
168
|
+
cancel_fedcm_dialog: [:post, 'session/:session_id/fedcm/canceldialog'],
|
169
|
+
select_fedcm_account: [:post, 'session/:session_id/fedcm/selectaccount'],
|
170
|
+
set_fedcm_delay: [:post, 'session/:session_id/fedcm/setdelayenabled'],
|
171
|
+
reset_fedcm_cooldown: [:post, 'session/:session_id/fedcm/resetcooldown']
|
160
172
|
}.freeze
|
161
173
|
end # Bridge
|
162
174
|
end # Remote
|
@@ -301,6 +301,7 @@ module Selenium
|
|
301
301
|
#
|
302
302
|
|
303
303
|
def local_storage_item(key, value = nil)
|
304
|
+
WebDriver.logger.deprecate('local_storage_item(key, value)', id: :local_storage_item)
|
304
305
|
if value
|
305
306
|
execute_script("localStorage.setItem('#{key}', '#{value}')")
|
306
307
|
else
|
@@ -309,22 +310,27 @@ module Selenium
|
|
309
310
|
end
|
310
311
|
|
311
312
|
def remove_local_storage_item(key)
|
313
|
+
WebDriver.logger.deprecate('remove_local_storage_item(key)', id: :remove_local_storage_item)
|
312
314
|
execute_script("localStorage.removeItem('#{key}')")
|
313
315
|
end
|
314
316
|
|
315
317
|
def local_storage_keys
|
318
|
+
WebDriver.logger.deprecate('local_storage_keys', id: :local_storage_keys)
|
316
319
|
execute_script('return Object.keys(localStorage)')
|
317
320
|
end
|
318
321
|
|
319
322
|
def clear_local_storage
|
323
|
+
WebDriver.logger.deprecate('clear_local_storage', id: :clear_local_storage)
|
320
324
|
execute_script('localStorage.clear()')
|
321
325
|
end
|
322
326
|
|
323
327
|
def local_storage_size
|
328
|
+
WebDriver.logger.deprecate('local_storage_size', id: :local_storage_size)
|
324
329
|
execute_script('return localStorage.length')
|
325
330
|
end
|
326
331
|
|
327
332
|
def session_storage_item(key, value = nil)
|
333
|
+
WebDriver.logger.deprecate('session_storage_item(key, value)', id: :session_storage_item)
|
328
334
|
if value
|
329
335
|
execute_script("sessionStorage.setItem('#{key}', '#{value}')")
|
330
336
|
else
|
@@ -333,18 +339,22 @@ module Selenium
|
|
333
339
|
end
|
334
340
|
|
335
341
|
def remove_session_storage_item(key)
|
342
|
+
WebDriver.logger.deprecate('remove_session_storage_item(key)', id: :remove_session_storage_item)
|
336
343
|
execute_script("sessionStorage.removeItem('#{key}')")
|
337
344
|
end
|
338
345
|
|
339
346
|
def session_storage_keys
|
347
|
+
WebDriver.logger.deprecate('session_storage_keys', id: :session_storage_keys)
|
340
348
|
execute_script('return Object.keys(sessionStorage)')
|
341
349
|
end
|
342
350
|
|
343
351
|
def clear_session_storage
|
352
|
+
WebDriver.logger.deprecate('clear_session_storage', id: :clear_session_storage)
|
344
353
|
execute_script('sessionStorage.clear()')
|
345
354
|
end
|
346
355
|
|
347
356
|
def session_storage_size
|
357
|
+
WebDriver.logger.deprecate('session_storage_size', id: :session_storage_size)
|
348
358
|
execute_script('return sessionStorage.length')
|
349
359
|
end
|
350
360
|
|
@@ -602,6 +612,46 @@ module Selenium
|
|
602
612
|
execute :set_user_verified, {authenticatorId: authenticator_id}, {isUserVerified: verified}
|
603
613
|
end
|
604
614
|
|
615
|
+
#
|
616
|
+
# federated-credential management
|
617
|
+
#
|
618
|
+
|
619
|
+
def cancel_fedcm_dialog
|
620
|
+
execute :cancel_fedcm_dialog
|
621
|
+
end
|
622
|
+
|
623
|
+
def select_fedcm_account(index)
|
624
|
+
execute :select_fedcm_account, {}, {accountIndex: index}
|
625
|
+
end
|
626
|
+
|
627
|
+
def fedcm_dialog_type
|
628
|
+
execute :get_fedcm_dialog_type
|
629
|
+
end
|
630
|
+
|
631
|
+
def fedcm_title
|
632
|
+
execute(:get_fedcm_title).fetch('title')
|
633
|
+
end
|
634
|
+
|
635
|
+
def fedcm_subtitle
|
636
|
+
execute(:get_fedcm_title).fetch('subtitle', nil)
|
637
|
+
end
|
638
|
+
|
639
|
+
def fedcm_account_list
|
640
|
+
execute :get_fedcm_account_list
|
641
|
+
end
|
642
|
+
|
643
|
+
def fedcm_delay(enabled)
|
644
|
+
execute :set_fedcm_delay, {}, {enabled: enabled}
|
645
|
+
end
|
646
|
+
|
647
|
+
def reset_fedcm_cooldown
|
648
|
+
execute :reset_fedcm_cooldown
|
649
|
+
end
|
650
|
+
|
651
|
+
def click_fedcm_dialog_button
|
652
|
+
execute :click_fedcm_dialog_button, {}, {dialogButton: 'ConfirmIdpLoginContinue'}
|
653
|
+
end
|
654
|
+
|
605
655
|
def bidi
|
606
656
|
msg = 'BiDi must be enabled by setting #web_socket_url to true in options class'
|
607
657
|
raise(WebDriver::Error::WebDriverError, msg)
|
@@ -37,6 +37,13 @@ module Selenium
|
|
37
37
|
#
|
38
38
|
|
39
39
|
class Curb < Common
|
40
|
+
attr_accessor :timeout
|
41
|
+
|
42
|
+
def initialize(timeout: nil)
|
43
|
+
@timeout = timeout
|
44
|
+
super()
|
45
|
+
end
|
46
|
+
|
40
47
|
def quit_errors
|
41
48
|
[Curl::Err::RecvError] + super
|
42
49
|
end
|
@@ -53,7 +60,7 @@ module Selenium
|
|
53
60
|
client.headers = headers
|
54
61
|
|
55
62
|
# http://github.com/taf2/curb/issues/issue/33
|
56
|
-
client.head
|
63
|
+
client.head = false
|
57
64
|
client.delete = false
|
58
65
|
|
59
66
|
case verb
|
@@ -80,11 +87,10 @@ module Selenium
|
|
80
87
|
@client ||= begin
|
81
88
|
c = Curl::Easy.new
|
82
89
|
|
83
|
-
c.max_redirects
|
90
|
+
c.max_redirects = MAX_REDIRECTS
|
84
91
|
c.follow_location = true
|
85
|
-
c.timeout
|
86
|
-
c.verbose
|
87
|
-
|
92
|
+
c.timeout = timeout if timeout
|
93
|
+
c.verbose = WebDriver.logger.debug?
|
88
94
|
c
|
89
95
|
end
|
90
96
|
end
|
@@ -28,7 +28,7 @@ module Selenium
|
|
28
28
|
attr_reader :code, :payload
|
29
29
|
|
30
30
|
def initialize(code, payload = nil)
|
31
|
-
@code
|
31
|
+
@code = code
|
32
32
|
@payload = payload || {}
|
33
33
|
|
34
34
|
assert_ok
|
@@ -37,11 +37,8 @@ module Selenium
|
|
37
37
|
def error
|
38
38
|
error, message, backtrace = process_error
|
39
39
|
klass = Error.for_error(error) || return
|
40
|
-
|
41
40
|
ex = klass.new(message)
|
42
|
-
ex
|
43
|
-
add_backtrace ex, backtrace
|
44
|
-
|
41
|
+
add_cause(ex, error, backtrace)
|
45
42
|
ex
|
46
43
|
end
|
47
44
|
|
@@ -59,34 +56,12 @@ module Selenium
|
|
59
56
|
raise Error::ServerError, self
|
60
57
|
end
|
61
58
|
|
62
|
-
def
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
when String
|
69
|
-
server_trace.split("\n")
|
70
|
-
end
|
71
|
-
|
72
|
-
ex.set_backtrace(backtrace + ex.backtrace)
|
73
|
-
end
|
74
|
-
|
75
|
-
def backtrace_from_remote(server_trace)
|
76
|
-
server_trace.filter_map do |frame|
|
77
|
-
next unless frame.is_a?(Hash)
|
78
|
-
|
79
|
-
file = frame['fileName']
|
80
|
-
line = frame['lineNumber']
|
81
|
-
meth = frame['methodName']
|
82
|
-
|
83
|
-
class_name = frame['className']
|
84
|
-
file = "#{class_name}(#{file})" if class_name
|
85
|
-
|
86
|
-
meth = 'unknown' if meth.nil? || meth.empty?
|
87
|
-
|
88
|
-
"[remote server] #{file}:#{line}:in `#{meth}'"
|
89
|
-
end
|
59
|
+
def add_cause(ex, error, backtrace)
|
60
|
+
cause = Error::WebDriverError.new
|
61
|
+
cause.set_backtrace(backtrace)
|
62
|
+
raise ex, cause: cause
|
63
|
+
rescue Error.for_error(error)
|
64
|
+
ex
|
90
65
|
end
|
91
66
|
|
92
67
|
def process_error
|
@@ -31,7 +31,7 @@ module Selenium
|
|
31
31
|
autoload :Capabilities, 'selenium/webdriver/remote/capabilities'
|
32
32
|
|
33
33
|
module Http
|
34
|
-
autoload :Common,
|
34
|
+
autoload :Common, 'selenium/webdriver/remote/http/common'
|
35
35
|
autoload :Default, 'selenium/webdriver/remote/http/default'
|
36
36
|
end
|
37
37
|
end
|
data/selenium-webdriver.gemspec
CHANGED
@@ -47,11 +47,11 @@ Gem::Specification.new do |s|
|
|
47
47
|
s.bindir = 'bin'
|
48
48
|
s.require_paths = ['lib']
|
49
49
|
|
50
|
-
s.
|
51
|
-
s.
|
52
|
-
s.
|
53
|
-
s.
|
54
|
-
s.
|
50
|
+
s.add_dependency 'base64', ['~> 0.2']
|
51
|
+
s.add_dependency 'logger', ['~> 1.4']
|
52
|
+
s.add_dependency 'rexml', ['~> 3.2', '>= 3.2.5']
|
53
|
+
s.add_dependency 'rubyzip', ['>= 1.2.2', '< 3.0']
|
54
|
+
s.add_dependency 'websocket', ['~> 1.0']
|
55
55
|
|
56
56
|
s.add_development_dependency 'git', ['~> 1.19']
|
57
57
|
s.add_development_dependency 'rack', ['~> 2.0']
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: selenium-webdriver
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.
|
4
|
+
version: 4.24.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alex Rodionov
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2024-
|
13
|
+
date: 2024-08-28 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: base64
|
@@ -328,6 +328,7 @@ files:
|
|
328
328
|
- lib/selenium/webdriver/common/driver_extensions/has_context.rb
|
329
329
|
- lib/selenium/webdriver/common/driver_extensions/has_debugger.rb
|
330
330
|
- lib/selenium/webdriver/common/driver_extensions/has_devtools.rb
|
331
|
+
- lib/selenium/webdriver/common/driver_extensions/has_fedcm_dialog.rb
|
331
332
|
- lib/selenium/webdriver/common/driver_extensions/has_file_downloads.rb
|
332
333
|
- lib/selenium/webdriver/common/driver_extensions/has_launching.rb
|
333
334
|
- lib/selenium/webdriver/common/driver_extensions/has_log_events.rb
|
@@ -343,6 +344,9 @@ files:
|
|
343
344
|
- lib/selenium/webdriver/common/driver_finder.rb
|
344
345
|
- lib/selenium/webdriver/common/element.rb
|
345
346
|
- lib/selenium/webdriver/common/error.rb
|
347
|
+
- lib/selenium/webdriver/common/fedcm.rb
|
348
|
+
- lib/selenium/webdriver/common/fedcm/account.rb
|
349
|
+
- lib/selenium/webdriver/common/fedcm/dialog.rb
|
346
350
|
- lib/selenium/webdriver/common/file_reaper.rb
|
347
351
|
- lib/selenium/webdriver/common/html5/local_storage.rb
|
348
352
|
- lib/selenium/webdriver/common/html5/session_storage.rb
|