mozilla / geckodriver

WebDriver for Firefox
https://firefox-source-docs.mozilla.org/testing/geckodriver/
Mozilla Public License 2.0
7.03k stars 1.51k forks source link

Chrome elements are not exposed #2060

Closed iuliantatarascu closed 1 year ago

iuliantatarascu commented 1 year ago

Bug description

Chrome elements that are outside the webpage content view are not findable by clients.

similar to https://bugzilla.mozilla.org/show_bug.cgi?id=1451916

System

Testcase

#!/usr/bin/env python3
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.firefox.options import Options

def main():
    opts = Options()
    opts.log.level = 'trace'

    driver = webdriver.Firefox(options=opts)

    driver.get('about:downloads')

    description = driver.find_element(By.TAG_NAME, 'description')

    print(description)

if __name__ == '__main__':
    main()

Expected output

<selenium.webdriver.remote.webelement.WebElement (session="0d9570f3-1736-454b-bddb-00997dd2edc7", element="d28ecd0d-976c-4402-b78c-e57783af3af3")>

Stacktrace and output observed

Traceback (most recent call last):
  File "C:\Users\IT\Desktop\geckodriver-test.py", line 21, in <module>
    main()
  File "C:\Users\IT\Desktop\geckodriver-test.py", line 15, in main
    description = driver.find_element(By.TAG_NAME, 'description')
  File "C:\Users\IT\AppData\Roaming\Python\Python310\site-packages\selenium\webdriver\remote\webdriver.py", line 856, in find_element
    return self.execute(Command.FIND_ELEMENT, {
  File "C:\Users\IT\AppData\Roaming\Python\Python310\site-packages\selenium\webdriver\remote\webdriver.py", line 429, in execute
    self.error_handler.check_response(response)
  File "C:\Users\IT\AppData\Roaming\Python\Python310\site-packages\selenium\webdriver\remote\errorhandler.py", line 243, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: Failed to extract web element from Marionette response

Trace-level log

geckodriver.log

Patch suggestion

--- testing/geckodriver/src/marionette.rs
+++ testing/geckodriver/src/marionette.rs (Unsaved)
@@ -59,8 +59,8 @@
 };
 use webdriver::command::{WebDriverCommand, WebDriverMessage};
 use webdriver::common::{
-    Cookie, Date, FrameId, LocatorStrategy, ShadowRoot, WebElement, ELEMENT_KEY, FRAME_KEY,
-    SHADOW_KEY, WINDOW_KEY,
+    Cookie, Date, FrameId, LocatorStrategy, ShadowRoot, WebElement, CHROME_ELEMENT_KEY,
+    ELEMENT_KEY, FRAME_KEY, SHADOW_KEY, WINDOW_KEY,
 };
 use webdriver::error::{ErrorStatus, WebDriverError, WebDriverResult};
 use webdriver::response::{
@@ -337,11 +337,12 @@
         );

         let element = data.get(ELEMENT_KEY);
+        let chromeelement = data.get(CHROME_ELEMENT_KEY);
         let frame = data.get(FRAME_KEY);
         let window = data.get(WINDOW_KEY);

         let value = try_opt!(
-            element.or(frame).or(window),
+            element.or(chromeelement).or(frame).or(window),
             ErrorStatus::UnknownError,
             "Failed to extract web element from Marionette response"
         );
--- testing/webdriver/src/common.rs
+++ testing/webdriver/src/common.rs (Unsaved)
@@ -8,6 +8,7 @@
 use std::fmt::{self, Display, Formatter};

 pub static ELEMENT_KEY: &str = "element-6066-11e4-a52e-4f735466cecf";
+pub static CHROME_ELEMENT_KEY: &str = "chromeelement-9fc5-4b51-a3c8-01716eedeb04";
 pub static FRAME_KEY: &str = "frame-075b-4da1-b6ba-e579c2d3230a";
 pub static SHADOW_KEY: &str = "shadow-6066-11e4-a52e-4f735466cecf";
 pub static WINDOW_KEY: &str = "window-fcc6-11e5-b4f8-330a88ab9d7f";
whimboo commented 1 year ago

This works like expected for me:

1667295598752   Marionette  DEBUG   3 -> [0,2,"WebDriver:Navigate",{"url":"about:downloads"}]
1667295598772   Marionette  TRACE   [12] Received event beforeunload for about:blank
1667295598772   Marionette  TRACE   [12] Received event pagehide for about:blank
1667295598797   Marionette  TRACE   [12] Received event DOMContentLoaded for about:downloads
1667295598797   Marionette  TRACE   [12] Received event pageshow for about:downloads
1667295598797   Marionette  DEBUG   3 <- [1,2,null,{"value":null}]
1667295598800   Marionette  DEBUG   3 -> [0,3,"WebDriver:FindElement",{"value":"description","using":"tag name"}]
1667295598803   Marionette  DEBUG   3 <- [1,3,null,{"value":{"element-6066-11e4-a52e-4f735466cecf":"13480a01-d053-417f-8f0f-7d3c2b0307dd"}}]

Note that in Firefox 103 we removed support for ChromeElement, and now these elements are basically WebElement as well.

iuliantatarascu commented 1 year ago

I am on ESR, so I guess I have to wait until Firefox 115.0 is released

whimboo commented 1 year ago

Yes, given that this is a backward incompatible change we explicitly landed this change after the 102ESR release. As you say you will have to wait for the next ESR. Until then make sure to also stay with geckodriver 0.31.0 which still has support for these kind of elements.