From 751bacb6bc934436ec9dec2416a022d8d577e30a Mon Sep 17 00:00:00 2001 From: Earlopain <14981592+Earlopain@users.noreply.github.com> Date: Tue, 19 Nov 2024 20:01:52 +0100 Subject: [PATCH 1/5] [rb] Resolve `uri` gem deprecation warning (#14770) > /home/user/.rbenv/versions/3.3.6/lib/ruby/gems/3.3.0/gems/selenium-webdriver-4.26.0/lib/selenium/webdriver/remote/bridge.rb:679: warning: URI::RFC3986_PARSER.escape is obsoleted. Use URI::RFC2396_PARSER.escape explicitly. Ruby switches the default parser from RFC2396 to RFC3986. This parser contains all methods from the old parser but delegates to RFC2396 for a few and warns. Namely `extract`, `make_regexp`, `escape`, and `unescape`. selenium currently supports Ruby >= 3.1, so the current old compatibility code is unnecessary. `RFC2396_PARSER` is a somewhat new addition, so some kind of check is still needed. It is available in Ruby 3.1 but early patch versions are missing it. --- rb/lib/selenium/webdriver/remote/bridge.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rb/lib/selenium/webdriver/remote/bridge.rb b/rb/lib/selenium/webdriver/remote/bridge.rb index 1678065010108..2c26285a780e0 100644 --- a/rb/lib/selenium/webdriver/remote/bridge.rb +++ b/rb/lib/selenium/webdriver/remote/bridge.rb @@ -686,7 +686,7 @@ def execute(command, opts = {}, command_hash = nil) end def escaper - @escaper ||= defined?(URI::Parser) ? URI::DEFAULT_PARSER : URI + @escaper ||= defined?(URI::RFC2396_PARSER) ? URI::RFC2396_PARSER : URI::DEFAULT_PARSER end def commands(command) From d9149acc097531d336e611bd92d897381a0316c6 Mon Sep 17 00:00:00 2001 From: Michael Render Date: Tue, 19 Nov 2024 14:12:56 -0500 Subject: [PATCH 2/5] [dotnet] Solidify nullability of `PinnedScript` (#14708) --- .../support/Events/EventFiringWebDriver.cs | 6 +++ dotnet/src/webdriver/IJavaScriptEngine.cs | 4 ++ dotnet/src/webdriver/IJavascriptExecutor.cs | 2 + dotnet/src/webdriver/ISearchContext.cs | 2 + dotnet/src/webdriver/JavaScriptEngine.cs | 25 ++++++++-- dotnet/src/webdriver/PinnedScript.cs | 49 +++++++------------ dotnet/src/webdriver/WebDriver.cs | 9 +++- dotnet/test/common/ExecutingJavascriptTest.cs | 28 +++++++++++ 8 files changed, 89 insertions(+), 36 deletions(-) diff --git a/dotnet/src/support/Events/EventFiringWebDriver.cs b/dotnet/src/support/Events/EventFiringWebDriver.cs index 46661f9225838..e68b261e387c3 100644 --- a/dotnet/src/support/Events/EventFiringWebDriver.cs +++ b/dotnet/src/support/Events/EventFiringWebDriver.cs @@ -478,6 +478,7 @@ public object ExecuteScript(string script, params object[] args) /// A object containing the code to execute. /// The arguments to the script. /// The value returned by the script. + /// If is . /// /// /// The ExecuteScript method executes JavaScript in the context of @@ -509,6 +510,11 @@ public object ExecuteScript(string script, params object[] args) /// public object ExecuteScript(PinnedScript script, params object[] args) { + if (script == null) + { + throw new ArgumentNullException(nameof(script)); + } + IJavaScriptExecutor javascriptDriver = this.driver as IJavaScriptExecutor; if (javascriptDriver == null) { diff --git a/dotnet/src/webdriver/IJavaScriptEngine.cs b/dotnet/src/webdriver/IJavaScriptEngine.cs index 0c4481d970b85..3445c59753d60 100644 --- a/dotnet/src/webdriver/IJavaScriptEngine.cs +++ b/dotnet/src/webdriver/IJavaScriptEngine.cs @@ -87,6 +87,7 @@ public interface IJavaScriptEngine : IDisposable /// The friendly name by which to refer to this initialization script. /// The JavaScript to be loaded on every page. /// A task containing an object representing the script to be loaded on each page. + /// If is . Task AddInitializationScript(string scriptName, string script); /// @@ -94,6 +95,7 @@ public interface IJavaScriptEngine : IDisposable /// /// The friendly name of the initialization script to be removed. /// A task that represents the asynchronous operation. + /// If is . Task RemoveInitializationScript(string scriptName); /// @@ -109,6 +111,7 @@ public interface IJavaScriptEngine : IDisposable /// /// The JavaScript to pin /// A task containing a object to use to execute the script. + /// If is . Task PinScript(string script); /// @@ -116,6 +119,7 @@ public interface IJavaScriptEngine : IDisposable /// /// The object to unpin. /// A task that represents the asynchronous operation. + /// If is . Task UnpinScript(PinnedScript script); /// diff --git a/dotnet/src/webdriver/IJavascriptExecutor.cs b/dotnet/src/webdriver/IJavascriptExecutor.cs index c8680a0c14c6c..fcbf9080efd2c 100644 --- a/dotnet/src/webdriver/IJavascriptExecutor.cs +++ b/dotnet/src/webdriver/IJavascriptExecutor.cs @@ -17,6 +17,7 @@ // under the License. // +using System; using System.Collections.Generic; namespace OpenQA.Selenium @@ -98,6 +99,7 @@ public interface IJavaScriptExecutor /// variable, as if the function were called via "Function.apply" /// /// + /// If is . object ExecuteScript(PinnedScript script, params object[] args); /// diff --git a/dotnet/src/webdriver/ISearchContext.cs b/dotnet/src/webdriver/ISearchContext.cs index 6f88562e296c8..53c5f33ae36da 100644 --- a/dotnet/src/webdriver/ISearchContext.cs +++ b/dotnet/src/webdriver/ISearchContext.cs @@ -17,6 +17,7 @@ // under the License. // +using System; using System.Collections.ObjectModel; namespace OpenQA.Selenium @@ -31,6 +32,7 @@ public interface ISearchContext /// /// The locating mechanism to use. /// The first matching on the current context. + /// If is . /// If no element matches the criteria. IWebElement FindElement(By by); diff --git a/dotnet/src/webdriver/JavaScriptEngine.cs b/dotnet/src/webdriver/JavaScriptEngine.cs index 35dc6764aac54..4bd4fe4676eb4 100644 --- a/dotnet/src/webdriver/JavaScriptEngine.cs +++ b/dotnet/src/webdriver/JavaScriptEngine.cs @@ -219,14 +219,25 @@ public async Task ClearInitializationScripts() /// /// The JavaScript to pin /// A task containing a object to use to execute the script. + /// If is . public async Task PinScript(string script) { + if (script == null) + { + throw new ArgumentNullException(nameof(script)); + } + + string newScriptHandle = Guid.NewGuid().ToString("N"); + // We do an "Evaluate" first so as to immediately create the script on the loaded // page, then will add it to the initialization of future pages. - PinnedScript pinnedScript = new PinnedScript(script); await this.EnableDomains().ConfigureAwait(false); - await this.session.Value.Domains.JavaScript.Evaluate(pinnedScript.CreationScript).ConfigureAwait(false); - pinnedScript.ScriptId = await this.session.Value.Domains.JavaScript.AddScriptToEvaluateOnNewDocument(pinnedScript.CreationScript).ConfigureAwait(false); + + string creationScript = PinnedScript.MakeCreationScript(newScriptHandle, script); + await this.session.Value.Domains.JavaScript.Evaluate(creationScript).ConfigureAwait(false); + string scriptId = await this.session.Value.Domains.JavaScript.AddScriptToEvaluateOnNewDocument(creationScript).ConfigureAwait(false); + + PinnedScript pinnedScript = new PinnedScript(script, newScriptHandle, scriptId); this.pinnedScripts[pinnedScript.Handle] = pinnedScript; return pinnedScript; } @@ -236,11 +247,17 @@ public async Task PinScript(string script) /// /// The object to unpin. /// A task that represents the asynchronous operation. + /// If is . public async Task UnpinScript(PinnedScript script) { + if (script == null) + { + throw new ArgumentNullException(nameof(script)); + } + if (this.pinnedScripts.ContainsKey(script.Handle)) { - await this.session.Value.Domains.JavaScript.Evaluate(script.RemovalScript).ConfigureAwait(false); + await this.session.Value.Domains.JavaScript.Evaluate(script.MakeRemovalScript()).ConfigureAwait(false); await this.session.Value.Domains.JavaScript.RemoveScriptToEvaluateOnNewDocument(script.ScriptId).ConfigureAwait(false); this.pinnedScripts.Remove(script.Handle); } diff --git a/dotnet/src/webdriver/PinnedScript.cs b/dotnet/src/webdriver/PinnedScript.cs index bf01e982385b6..629c1bd7212f3 100644 --- a/dotnet/src/webdriver/PinnedScript.cs +++ b/dotnet/src/webdriver/PinnedScript.cs @@ -17,83 +17,70 @@ // under the License. // -using System; using System.Globalization; +#nullable enable + namespace OpenQA.Selenium { /// /// A class representing a pinned JavaScript function that can be repeatedly called /// without sending the entire script across the wire for every execution. /// - public class PinnedScript + public sealed class PinnedScript { - private string scriptSource; - private string scriptHandle; - private string scriptId; - /// /// Initializes a new instance of the class. /// /// The body of the JavaScript function to pin. + /// The unique handle for this pinned script. + /// The internal ID of this script. /// /// This constructor is explicitly internal. Creation of pinned script objects /// is strictly the perview of Selenium, and should not be required by external /// libraries. /// - internal PinnedScript(string script) + internal PinnedScript(string script, string stringHandle, string scriptId) { - this.scriptSource = script; - this.scriptHandle = Guid.NewGuid().ToString("N"); + this.Source = script; + this.Handle = stringHandle; + this.ScriptId = scriptId; } /// /// Gets the unique handle for this pinned script. /// - public string Handle - { - get { return this.scriptHandle; } - } + public string Handle { get; } /// /// Gets the source representing the body of the function in the pinned script. /// - public string Source - { - get { return this.scriptSource; } - } + public string Source { get; } - /// - /// Gets the script to create the pinned script in the browser. - /// - internal string CreationScript + internal static string MakeCreationScript(string scriptHandle, string scriptSource) { - get { return string.Format(CultureInfo.InvariantCulture, "function __webdriver_{0}(arguments) {{ {1} }}", this.scriptHandle, this.scriptSource); } + return string.Format(CultureInfo.InvariantCulture, "function __webdriver_{0}(arguments) {{ {1} }}", scriptHandle, scriptSource); } /// /// Gets the script used to execute the pinned script in the browser. /// - internal string ExecutionScript + internal string MakeExecutionScript() { - get { return string.Format(CultureInfo.InvariantCulture, "return __webdriver_{0}(arguments)", this.scriptHandle); } + return string.Format(CultureInfo.InvariantCulture, "return __webdriver_{0}(arguments)", this.Handle); } /// /// Gets the script used to remove the pinned script from the browser. /// - internal string RemovalScript + internal string MakeRemovalScript() { - get { return string.Format(CultureInfo.InvariantCulture, "__webdriver_{0} = undefined", this.scriptHandle); } + return string.Format(CultureInfo.InvariantCulture, "__webdriver_{0} = undefined", this.Handle); } /// /// Gets or sets the ID of this script. /// - internal string ScriptId - { - get { return this.scriptId; } - set { this.scriptId = value; } - } + internal string ScriptId { get; } } } diff --git a/dotnet/src/webdriver/WebDriver.cs b/dotnet/src/webdriver/WebDriver.cs index 1106fb0da8bbd..e29ce29a12c79 100644 --- a/dotnet/src/webdriver/WebDriver.cs +++ b/dotnet/src/webdriver/WebDriver.cs @@ -280,9 +280,15 @@ public object ExecuteScript(string script, params object[] args) /// A object containing the JavaScript code to execute. /// The arguments to the script. /// The value returned by the script. + /// If is . public object ExecuteScript(PinnedScript script, params object[] args) { - return this.ExecuteScript(script.ExecutionScript, args); + if (script == null) + { + throw new ArgumentNullException(nameof(script)); + } + + return this.ExecuteScript(script.MakeExecutionScript(), args); } /// @@ -290,6 +296,7 @@ public object ExecuteScript(PinnedScript script, params object[] args) /// /// By mechanism to find the object /// IWebElement object so that you can interact with that object + /// If is . /// /// /// IWebDriver driver = new InternetExplorerDriver(); diff --git a/dotnet/test/common/ExecutingJavascriptTest.cs b/dotnet/test/common/ExecutingJavascriptTest.cs index 463f82a4c434f..048b712d3178d 100644 --- a/dotnet/test/common/ExecutingJavascriptTest.cs +++ b/dotnet/test/common/ExecutingJavascriptTest.cs @@ -21,6 +21,7 @@ using System; using System.Collections.Generic; using System.Collections.ObjectModel; +using System.Threading.Tasks; namespace OpenQA.Selenium { @@ -468,6 +469,33 @@ public void ShouldBeAbleToExecuteABigChunkOfJavascriptCode() } } + [Test] + [IgnoreBrowser(Selenium.Browser.IE, "IE does not support Chrome DevTools Protocol")] + [IgnoreBrowser(Selenium.Browser.Firefox, "Firefox does not support Chrome DevTools Protocol")] + [IgnoreBrowser(Selenium.Browser.Safari, "Safari does not support Chrome DevTools Protocol")] + public async Task ShouldBeAbleToPinJavascriptCodeAndExecuteRepeatedly() + { + IJavaScriptEngine jsEngine = new JavaScriptEngine(driver); + + driver.Url = xhtmlTestPage; + + PinnedScript script = await jsEngine.PinScript("return document.title;"); + for (int i = 0; i < 5; i++) + { + object result = ((IJavaScriptExecutor)driver).ExecuteScript(script); + + Assert.That(result, Is.InstanceOf()); + Assert.That(result, Is.EqualTo("XHTML Test Page")); + } + + await jsEngine.UnpinScript(script); + + Assert.That(() => + { + _ = ((IJavaScriptExecutor)driver).ExecuteScript(script); + }, Throws.TypeOf()); + } + [Test] public void ShouldBeAbleToExecuteScriptAndReturnElementsList() { From 673d2c78be76f1ccbb2e1017e5240d52f428b400 Mon Sep 17 00:00:00 2001 From: Sandeep Suryaprasad <26169602+sandeepsuryaprasad@users.noreply.github.com> Date: Wed, 20 Nov 2024 05:33:17 +0530 Subject: [PATCH 3/5] [py] moved project metadata from `setup.py` to `pyproject.toml` (#14311) --- py/pyproject.toml | 44 +++++++++++++++++++++++++++++++++- py/setup.py | 60 +---------------------------------------------- 2 files changed, 44 insertions(+), 60 deletions(-) diff --git a/py/pyproject.toml b/py/pyproject.toml index eecffc1f3c3c8..7ee15417a32f1 100644 --- a/py/pyproject.toml +++ b/py/pyproject.toml @@ -2,12 +2,54 @@ requires = ["setuptools", "setuptools-rust"] build-backend = "setuptools.build_meta" +[project] +name = "selenium" +version = "4.27.0.dev202410311942" +license = "Apache 2.0" +description = "Official Python bindings for Selenium WebDriver." +readme = "README.rst" +requires-python = "~=3.8" +classifiers = [ + "Development Status :: 5 - Production/Stable", + "Intended Audience :: Developers", + "License :: OSI Approved :: Apache Software License", + "Operating System :: POSIX", + "Operating System :: Microsoft :: Windows", + "Operating System :: MacOS :: MacOS X", + "Topic :: Software Development :: Testing", + "Topic :: Software Development :: Libraries", + "Programming Language :: Python", + "Programming Language :: Python :: 3.8", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + ] +dependencies = [ + "urllib3[socks]>=1.26,<3", + "trio~=0.17", + "trio-websocket~=0.9", + "certifi>=2021.10.8", + "typing_extensions~=4.9", + "websocket-client~=1.8", + ] + +[tool.setuptools] +zip-safe = false + [tool.setuptools.packages.find] include = ["selenium*"] exclude = ["test*"] -namespaces = false +namespace = false # include-package-data is `true` by default in pyproject.toml +[project.urls] +Repository = "https://github.com/SeleniumHQ/selenium/" +BugTracker = "https://github.com/SeleniumHQ/selenium/issues" +Changelog = "https://github.com/SeleniumHQ/selenium/blob/trunk/py/CHANGES" +Documentation = "https://www.selenium.dev/documentation/overview/" +SourceCode = "https://github.com/SeleniumHQ/selenium/tree/trunk/py" + [tool.setuptools.package-data] selenium_package = [ "*.py", diff --git a/py/setup.py b/py/setup.py index cd6b84b8e2c14..3014b5321e307 100755 --- a/py/setup.py +++ b/py/setup.py @@ -27,70 +27,12 @@ setup_args = { 'cmdclass': {'install': install}, - 'name': 'selenium', - 'version': "4.27.0.dev202410311942", - 'license': 'Apache 2.0', - 'description': 'Official Python bindings for Selenium WebDriver.', - 'long_description': open(join(abspath(dirname(__file__)), "README.rst")).read(), - 'url': 'https://github.com/SeleniumHQ/selenium/', - 'project_urls': { - 'Bug Tracker': 'https://github.com/SeleniumHQ/selenium/issues', - 'Changes': 'https://github.com/SeleniumHQ/selenium/blob/trunk/py/CHANGES', - 'Documentation': 'https://www.selenium.dev/documentation/overview/', - 'Source Code': 'https://github.com/SeleniumHQ/selenium/tree/trunk/py', - }, - 'python_requires': '~=3.8', - 'classifiers': ['Development Status :: 5 - Production/Stable', - 'Intended Audience :: Developers', - 'License :: OSI Approved :: Apache Software License', - 'Operating System :: POSIX', - 'Operating System :: Microsoft :: Windows', - 'Operating System :: MacOS :: MacOS X', - 'Topic :: Software Development :: Testing', - 'Topic :: Software Development :: Libraries', - 'Programming Language :: Python', - 'Programming Language :: Python :: 3.8', - 'Programming Language :: Python :: 3.9', - 'Programming Language :: Python :: 3.10', - 'Programming Language :: Python :: 3.11', - 'Programming Language :: Python :: 3.12', - ], - 'package_dir': { - 'selenium': 'selenium', - 'selenium.common': 'selenium/common', - 'selenium.webdriver': 'selenium/webdriver', - }, - 'packages': ['selenium', - 'selenium.common', - 'selenium.webdriver', - 'selenium.webdriver.chrome', - 'selenium.webdriver.chromium', - 'selenium.webdriver.common', - 'selenium.webdriver.edge', - 'selenium.webdriver.firefox', - 'selenium.webdriver.ie', - 'selenium.webdriver.remote', - 'selenium.webdriver.safari', - 'selenium.webdriver.support', - 'selenium.webdriver.webkitgtk', - 'selenium.webdriver.wpewebkit', - ], - 'include_package_data': True, - 'install_requires': [ - "urllib3[socks]>=1.26,<3", - "trio~=0.17", - "trio-websocket~=0.9", - "certifi>=2021.10.8", - "typing_extensions~=4.9", - "websocket-client~=1.8", - ], 'rust_extensions': [ RustExtension( {"selenium-manager": "selenium.webdriver.common.selenium-manager"}, binding=Binding.Exec ) ], - 'zip_safe': False } -setup(**setup_args) +setup(**setup_args) \ No newline at end of file From 8f725b3a80c3f3d621821e94a87db346ea91a8b1 Mon Sep 17 00:00:00 2001 From: Puja Jagani Date: Wed, 20 Nov 2024 09:54:27 +0530 Subject: [PATCH 4/5] [dotnet] Add CDP deprecation warning for Firefox (#14759) Co-authored-by: Nikolay Borisenko <22616990+nvborisenko@users.noreply.github.com> --- dotnet/src/webdriver/Firefox/FirefoxDriver.cs | 1 + dotnet/src/webdriver/Remote/RemoteWebDriver.cs | 11 +++++++++++ 2 files changed, 12 insertions(+) diff --git a/dotnet/src/webdriver/Firefox/FirefoxDriver.cs b/dotnet/src/webdriver/Firefox/FirefoxDriver.cs index da3061c897d8b..99f9cb3ea68c6 100644 --- a/dotnet/src/webdriver/Firefox/FirefoxDriver.cs +++ b/dotnet/src/webdriver/Firefox/FirefoxDriver.cs @@ -413,6 +413,7 @@ public DevToolsSession GetDevToolsSession(int devToolsProtocolVersion) /// Creates a session to communicate with a browser using a Developer Tools debugging protocol. /// /// The active session to use to communicate with the Developer Tools debugging protocol. + [Obsolete("CDP support for Firefox is deprecated and will be removed in future versions. Please switch to WebDriver BiDi.")] public DevToolsSession GetDevToolsSession(DevToolsOptions options) { if (this.devToolsSession == null) diff --git a/dotnet/src/webdriver/Remote/RemoteWebDriver.cs b/dotnet/src/webdriver/Remote/RemoteWebDriver.cs index 35a32af124d78..8483eb2fbc3ec 100644 --- a/dotnet/src/webdriver/Remote/RemoteWebDriver.cs +++ b/dotnet/src/webdriver/Remote/RemoteWebDriver.cs @@ -17,6 +17,7 @@ // under the License. // +using OpenQA.Selenium.Internal.Logging; using OpenQA.Selenium.DevTools; using System; using System.Collections.Generic; @@ -63,6 +64,8 @@ namespace OpenQA.Selenium.Remote /// public class RemoteWebDriver : WebDriver, IDevTools, IHasDownloads { + private static readonly ILogger _logger = OpenQA.Selenium.Internal.Logging.Log.GetLogger(typeof(RemoteWebDriver)); + /// /// The name of the Selenium grid remote DevTools end point capability. /// @@ -425,6 +428,14 @@ public ReadOnlyCollection FindElementsByCssSelector(string cssSelec /// The active session to use to communicate with the Developer Tools debugging protocol. public DevToolsSession GetDevToolsSession() { + if (this.Capabilities.GetCapability(CapabilityType.BrowserName) == "firefox") + { + if (_logger.IsEnabled(LogEventLevel.Warn)) + { + _logger.Warn("CDP support for Firefox is deprecated and will be removed in future versions. Please switch to WebDriver BiDi."); + } + } + return GetDevToolsSession(new DevToolsOptions() { ProtocolVersion = DevToolsSession.AutoDetectDevToolsProtocolVersion }); } From 789e8d42de31a507ff78958025e395bebd2dab46 Mon Sep 17 00:00:00 2001 From: Viet Nguyen Duc Date: Wed, 20 Nov 2024 17:46:34 +0700 Subject: [PATCH 5/5] [ci][py] Update latest index for new Nightly upload (#14739) Signed-off-by: Viet Nguyen Duc --- Rakefile | 5 +++-- py/BUILD.bazel | 2 +- py/docs/source/conf.py | 2 +- py/pyproject.toml | 10 +++++----- py/selenium/__init__.py | 2 +- py/selenium/webdriver/__init__.py | 2 +- py/setup.py | 2 +- 7 files changed, 13 insertions(+), 12 deletions(-) diff --git a/Rakefile b/Rakefile index 24f41e429f1cd..454096c176366 100644 --- a/Rakefile +++ b/Rakefile @@ -582,10 +582,11 @@ namespace :py do desc 'Update Python version' task :version, [:version] do |_task, arguments| old_version = python_version - nightly = ".dev#{Time.now.strftime('%Y%m%d%H%M')}" + nightly = ".#{Time.now.strftime('%Y%m%d%H%M')}" new_version = updated_version(old_version, arguments[:version], nightly) ['py/setup.py', + 'py/pyproject.toml', 'py/BUILD.bazel', 'py/selenium/__init__.py', 'py/selenium/webdriver/__init__.py', @@ -1138,7 +1139,7 @@ def updated_version(current, desired = nil, nightly = nil) desired.split('.').tap { |v| v << 0 while v.size < 3 }.join('.') elsif current.split(/\.|-/).size > 3 # if current version is already nightly, just need to bump it; this will be noop for some languages - pattern = /-?\.?(nightly|SNAPSHOT|dev)\d*$/ + pattern = /-?\.?(nightly|SNAPSHOT|dev|\d{12})\d*$/ current.gsub(pattern, nightly) elsif current.split(/\.|-/).size == 3 # if current version is not nightly, need to bump the version and make nightly diff --git a/py/BUILD.bazel b/py/BUILD.bazel index beba3d5684c7c..0e955f052f4d8 100644 --- a/py/BUILD.bazel +++ b/py/BUILD.bazel @@ -62,7 +62,7 @@ compile_pip_requirements( ], ) -SE_VERSION = "4.27.0.dev202410311942" +SE_VERSION = "4.27.0.202410311942" BROWSER_VERSIONS = [ "v85", diff --git a/py/docs/source/conf.py b/py/docs/source/conf.py index 1d5148a0508fa..41a620b368248 100644 --- a/py/docs/source/conf.py +++ b/py/docs/source/conf.py @@ -58,7 +58,7 @@ # The short X.Y version. version = '4.27' # The full version, including alpha/beta/rc tags. -release = '4.27.0.dev202410311942' +release = '4.27.0.202410311942' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff --git a/py/pyproject.toml b/py/pyproject.toml index 7ee15417a32f1..6488cda070f56 100644 --- a/py/pyproject.toml +++ b/py/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "selenium" -version = "4.27.0.dev202410311942" +version = "4.27.0.202410311942" license = "Apache 2.0" description = "Official Python bindings for Selenium WebDriver." readme = "README.rst" @@ -52,15 +52,15 @@ SourceCode = "https://github.com/SeleniumHQ/selenium/tree/trunk/py" [tool.setuptools.package-data] selenium_package = [ - "*.py", + "*.py", "*.rst", - "*.json", - "*.xpi", + "*.json", + "*.xpi", "*.js", "py.typed", "prune*", "selenium.egg-info*", - "selenium-manager", + "selenium-manager", "selenium-manager.exe", "CHANGES", "LICENSE" diff --git a/py/selenium/__init__.py b/py/selenium/__init__.py index e7ab5cc0b075e..8fa1fd3219d4d 100644 --- a/py/selenium/__init__.py +++ b/py/selenium/__init__.py @@ -16,4 +16,4 @@ # under the License. -__version__ = "4.27.0.dev202410311942" +__version__ = "4.27.0.202410311942" diff --git a/py/selenium/webdriver/__init__.py b/py/selenium/webdriver/__init__.py index b64471644e380..c57217aefb69f 100644 --- a/py/selenium/webdriver/__init__.py +++ b/py/selenium/webdriver/__init__.py @@ -44,7 +44,7 @@ from .wpewebkit.service import Service as WPEWebKitService # noqa from .wpewebkit.webdriver import WebDriver as WPEWebKit # noqa -__version__ = "4.27.0.dev202410311942" +__version__ = "4.27.0.202410311942" # We need an explicit __all__ because the above won't otherwise be exported. __all__ = [ diff --git a/py/setup.py b/py/setup.py index 3014b5321e307..0f93e33f0ecae 100755 --- a/py/setup.py +++ b/py/setup.py @@ -35,4 +35,4 @@ ], } -setup(**setup_args) \ No newline at end of file +setup(**setup_args)