diff --git a/examples/ruby/Gemfile b/examples/ruby/Gemfile
index 17d408f72607..dd23c86ad048 100644
--- a/examples/ruby/Gemfile
+++ b/examples/ruby/Gemfile
@@ -7,5 +7,5 @@ gem 'rake', '~> 13.0'
gem 'rspec', '~> 3.0'
gem 'rubocop', '~> 1.35'
gem 'rubocop-rspec', '~> 3.0'
-gem 'selenium-devtools', '= 0.133.0'
-gem 'selenium-webdriver', '= 4.29.1'
+gem 'selenium-devtools', '= 0.134.0'
+gem 'selenium-webdriver', '= 4.30.0'
diff --git a/examples/ruby/spec/interactions/frames_spec.rb b/examples/ruby/spec/interactions/frames_spec.rb
index d7b27b174044..f505d2032782 100644
--- a/examples/ruby/spec/interactions/frames_spec.rb
+++ b/examples/ruby/spec/interactions/frames_spec.rb
@@ -3,5 +3,40 @@
require 'spec_helper'
RSpec.describe 'Frames' do
+ #set session
let(:driver) { start_session }
+ let(:wait) { Selenium::WebDriver::Wait.new(timeout: 2) }
+
+ it 'interacts with elements inside iframes' do
+ #navigate to web page
+ driver.navigate.to 'https://www.selenium.dev/selenium/web/iframes.html'
+ # Switch to iframe using WebElement
+ iframe = driver.find_element(id: 'iframe1')
+ driver.switch_to.frame(iframe)
+ expect(driver.page_source.include?('We Leave From Here')).to be true
+
+ # Interact with email field
+ email_element = driver.find_element(id: 'email')
+ email_element.send_keys('admin@selenium.dev')
+ email_element.clear
+ driver.switch_to.default_content
+
+ # Switch to iframe using name
+ iframe=driver.find_element(name: 'iframe1-name')
+ driver.switch_to.frame(iframe)
+ expect(driver.page_source.include?('We Leave From Here')).to be true
+
+ email = driver.find_element(id: 'email')
+ email.send_keys('admin@selenium.dev')
+ email.clear
+ driver.switch_to.default_content
+
+ # Switch to iframe using index
+ driver.switch_to.frame(0)
+ expect(driver.page_source.include?('We Leave From Here')).to be true
+
+ # Leave frame
+ driver.switch_to.default_content
+ expect(driver.page_source.include?('This page has iframes')).to be true
+ end
end
diff --git a/website_and_docs/content/blog/2025/selenium-community-live-episode4.md b/website_and_docs/content/blog/2025/selenium-community-live-episode4.md
new file mode 100644
index 000000000000..1b7a8e0b96e1
--- /dev/null
+++ b/website_and_docs/content/blog/2025/selenium-community-live-episode4.md
@@ -0,0 +1,40 @@
+---
+title: "Selenium Community Live - Episode 4"
+linkTitle: "Selenium Community Live - Episode 4"
+date: 2025-03-19
+tags: ["webinar", "meetup", "talks","community"]
+categories: ["webinar"]
+author: Pallavi Sharma
+images:
+description: >
+ Selenium Community Live - Episode 4
+---
+
+The fourth episode of Selenium Community Live happened on March 19th, 2025, with speaker **Michael Mintz**, event hosted by **Pallavi Sharma**
+
+You can watch the episode on YouTube here- **Episode 4 on YouTube**
+or
+You can watch the episode on LinkedIn here- **Episode 4 on LinkedIn**
+
+**Selenium Community Live - Episode 4**
+
+Michael Mintz is creator of Selenium Base, an all in one Browser Automation Framework, built over Selenium WebDriver Python bindings. The framework is well known and used
+in the WebDriver Ecosystem community for testing, web scraping, web crawling and stealth purposes.
+You can find out more about Selenium Base here - **Selenium Base**
+
+
+**Meet the Speakers:**
+
+1. **Michael Mintz**
+
+
+## Watch the Recording
+
+Couldn’t join us live? Watch the entire episode here -
+📹 Recording Link: [Watch the Event Recording on YouTube](https://youtube.com/live/FSH712hhHvo?feature=share)
+
+To know more about Selenium Base, please follow the link
+**Explore more on Selenium Base**
+
+In case you were wondering what happened to episode 3, it was cancelled but will be scheduled in coming weeks. Thank you!
+Stay tuned as we bring the next! **Subscribe here to the Selenium HQ Official YouTube Channel.**
diff --git a/website_and_docs/content/documentation/webdriver/interactions/frames.en.md b/website_and_docs/content/documentation/webdriver/interactions/frames.en.md
index 4c02033c24c7..32e1b20034fa 100644
--- a/website_and_docs/content/documentation/webdriver/interactions/frames.en.md
+++ b/website_and_docs/content/documentation/webdriver/interactions/frames.en.md
@@ -88,16 +88,11 @@ driver.find_element(By.TAG_NAME, 'button').click()
{{< tab header="CSharp" text=true >}}
{{< gh-codeblock path="examples/dotnet/SeleniumDocs/Interactions/FramesTest.cs#L38-L46" >}}
{{< /tab >}}
- {{< tab header="Ruby" >}}
- # Store iframe web element
-iframe = driver.find_element(:css,'#modal > iframe')
- # Switch to the frame
-driver.switch_to.frame iframe
+{{< tab header="Ruby" text=true >}}
+{{< gh-codeblock path="examples\ruby\spec\interactions\frames_spec.rb#L13-L22" >}}
+{{< /tab >}}
- # Now, Click on the button
-driver.find_element(:tag_name,'button').click
- {{< /tab >}}
{{< tab header="JavaScript" >}}
// Store the web element
const iframe = driver.findElement(By.css('#modal > iframe'));
@@ -140,24 +135,12 @@ driver.find_element(By.TAG_NAME, 'button').click()
{{< tab header="CSharp" text=true >}}
{{< gh-codeblock path="examples/dotnet/SeleniumDocs/Interactions/FramesTest.cs#L50-L58" >}}
{{< /tab >}}
- {{< tab header="Ruby" >}}
- # Switch by ID
-driver.switch_to.frame 'buttonframe'
- # Now, Click on the button
-driver.find_element(:tag_name,'button').click
- {{< /tab >}}
- {{< tab header="JavaScript" >}}
-// Using the ID
-await driver.switchTo().frame('buttonframe');
-
-// Or using the name instead
-await driver.switchTo().frame('myframe');
+{{< tab header="Ruby" text=true >}}
+{{< gh-codeblock path="examples\ruby\spec\interactions\frames_spec.rb#L24-L32" >}}
+{{< /tab >}}
-// Now we can click the button
-await driver.findElement(By.css('button')).click();
- {{< /tab >}}
- {{< tab header="Kotlin" >}}
+{{< tab header="Kotlin" >}}
//Using the ID
driver.switchTo().frame("buttonframe")
@@ -181,13 +164,20 @@ queried using _window.frames_ in JavaScript.
{{< gh-codeblock path="examples/java/src/test/java/dev/selenium/interactions/FramesTest.java#L62-L63" >}}
{{< /tab >}}
- {{< tab header="Ruby" >}}
- # Switch to the second frame
-driver.switch_to.frame(1)
+ {{< tab header="Python" >}}
+ # missing code
+
{{< /tab >}}
+
{{< tab header="CSharp" text=true >}}
{{< gh-codeblock path="examples/dotnet/SeleniumDocs/Interactions/FramesTest.cs#L62-L63" >}}
{{< /tab >}}
+
+ {{< tab header="Ruby" text=true >}}
+{{< gh-codeblock path="examples\ruby\spec\interactions\frames_spec.rb#L34-L36" >}}
+{{< /tab >}}
+
+
{{< tab header="JavaScript" >}}
// Switches to the second frame
await driver.switchTo().frame(1);
@@ -217,10 +207,11 @@ driver.switch_to.default_content()
{{< tab header="CSharp" text=true >}}
{{< gh-codeblock path="examples/dotnet/SeleniumDocs/Interactions/FramesTest.cs#L66-L67" >}}
{{< /tab >}}
- {{< tab header="Ruby" >}}
- # Return to the top level
-driver.switch_to.default_content
- {{< /tab >}}
+
+ {{< tab header="Ruby" text=true >}}
+{{< gh-codeblock path="examples\ruby\spec\interactions\frames_spec.rb#L38-L40" >}}
+{{< /tab >}}
+
{{< tab header="JavaScript" >}}
// Return to the top level
await driver.switchTo().defaultContent();
diff --git a/website_and_docs/content/documentation/webdriver/interactions/frames.ja.md b/website_and_docs/content/documentation/webdriver/interactions/frames.ja.md
index 97ae27619657..1a283d56dad1 100644
--- a/website_and_docs/content/documentation/webdriver/interactions/frames.ja.md
+++ b/website_and_docs/content/documentation/webdriver/interactions/frames.ja.md
@@ -77,16 +77,11 @@ driver.find_element(By.TAG_NAME, 'button').click()
{{< tab header="CSharp" text=true >}}
{{< gh-codeblock path="examples/dotnet/SeleniumDocs/Interactions/FramesTest.cs#L38-L46" >}}
{{< /tab >}}
- {{< tab header="Ruby" >}}
- # Store iframe web element
-iframe = driver.find_element(:css,'#modal > iframe')
- # Switch to the frame
-driver.switch_to.frame iframe
+ {{< tab header="Ruby" text=true >}}
+{{< gh-codeblock path="examples\ruby\spec\interactions\frames_spec.rb#L13-L22" >}}
+{{< /tab >}}
- # Now, Click on the button
-driver.find_element(:tag_name,'button').click
- {{< /tab >}}
{{< tab header="JavaScript" >}}
// Store the web element
const iframe = driver.findElement(By.css('#modal > iframe'));
@@ -118,6 +113,7 @@ FrameまたはiFrameにidまたはname属性がある場合、代わりにこれ
{{< tab header="Java" text=true >}}
{{< gh-codeblock path="examples/java/src/test/java/dev/selenium/interactions/FramesTest.java#L50-L58" >}}
{{< /tab >}}
+
{{< tab header="Python" >}}
# Switch frame by id
driver.switch_to.frame('buttonframe')
@@ -125,9 +121,16 @@ driver.switch_to.frame('buttonframe')
# Now, Click on the button
driver.find_element(By.TAG_NAME, 'button').click()
{{< /tab >}}
+
{{< tab header="CSharp" text=true >}}
{{< gh-codeblock path="examples/dotnet/SeleniumDocs/Interactions/FramesTest.cs#L50-L58" >}}
{{< /tab >}}
+
+{{< tab header="Ruby" text=true >}}
+{{< gh-codeblock path="examples\ruby\spec\interactions\frames_spec.rb#L24-L32" >}}
+{{< /tab >}}
+
+
{{< tab header="JavaScript" >}}
// Using the ID
await driver.switchTo().frame('buttonframe');
@@ -158,20 +161,24 @@ JavaScriptの _window.frames_ を使用して照会できるように、Frameの
{{< tab header="Java" text=true >}}
{{< gh-codeblock path="examples/java/src/test/java/dev/selenium/interactions/FramesTest.java#L62-L63" >}}
{{< /tab >}}
- {{< tab header="Ruby" >}}
- # Switch to the second frame
-driver.switch_to.frame(1)
- {{< /tab >}}
- {{< tab header="CSharp" text=true >}}
-{{< gh-codeblock path="examples/dotnet/SeleniumDocs/Interactions/FramesTest.cs#L62-L63" >}}
-{{< /tab >}}
- {{< tab header="Python" >}}
+
+{{< tab header="Python" >}}
# switching to second iframe based on index
iframe = driver.find_elements(By.TAG_NAME,'iframe')[1]
# switch to selected iframe
driver.switch_to.frame(iframe)
{{< /tab >}}
+
+ {{< tab header="CSharp" text=true >}}
+{{< gh-codeblock path="examples/dotnet/SeleniumDocs/Interactions/FramesTest.cs#L62-L63" >}}
+{{< /tab >}}
+
+{{< tab header="Ruby" text=true >}}
+{{< gh-codeblock path="examples\ruby\spec\interactions\frames_spec.rb#L34-L36" >}}
+{{< /tab >}}
+
+
{{< tab header="JavaScript" >}}
// Switches to the second frame
await driver.switchTo().frame(1);
@@ -198,10 +205,11 @@ driver.switch_to.default_content()
{{< tab header="CSharp" text=true >}}
{{< gh-codeblock path="examples/dotnet/SeleniumDocs/Interactions/FramesTest.cs#L66-L67" >}}
{{< /tab >}}
- {{< tab header="Ruby" >}}
- # Return to the top level
-driver.switch_to.default_content
- {{< /tab >}}
+
+ {{< tab header="Ruby" text=true >}}
+{{< gh-codeblock path="examples\ruby\spec\interactions\frames_spec.rb#L38-L40" >}}
+{{< /tab >}}
+
{{< tab header="JavaScript" >}}
// Return to the top level
await driver.switchTo().defaultContent();
diff --git a/website_and_docs/content/documentation/webdriver/interactions/frames.pt-br.md b/website_and_docs/content/documentation/webdriver/interactions/frames.pt-br.md
index 0fd61db35931..e0576c8b2d81 100644
--- a/website_and_docs/content/documentation/webdriver/interactions/frames.pt-br.md
+++ b/website_and_docs/content/documentation/webdriver/interactions/frames.pt-br.md
@@ -85,16 +85,9 @@ driver.find_element(By.TAG_NAME, 'button').click()
{{< tab header="CSharp" text=true >}}
{{< gh-codeblock path="examples/dotnet/SeleniumDocs/Interactions/FramesTest.cs#L38-L46" >}}
{{< /tab >}}
- {{< tab header="Ruby" >}}
- # Store iframe web element
-iframe = driver.find_element(:css,'#modal > iframe')
-
- # Switch to the frame
-driver.switch_to.frame iframe
-
- # Now, Click on the button
-driver.find_element(:tag_name,'button').click
- {{< /tab >}}
+{{< tab header="Ruby" text=true >}}
+{{< gh-codeblock path="examples\ruby\spec\interactions\frames_spec.rb#L13-L22" >}}
+{{< /tab >}}
{{< tab header="JavaScript" >}}
// Store the web element
const iframe = driver.findElement(By.css('#modal > iframe'));
@@ -136,23 +129,12 @@ driver.find_element(By.TAG_NAME, 'button').click()
{{< tab header="CSharp" text=true >}}
{{< gh-codeblock path="examples/dotnet/SeleniumDocs/Interactions/FramesTest.cs#L50-L58" >}}
{{< /tab >}}
- {{< tab header="Ruby" >}}
- # Switch by ID
-driver.switch_to.frame 'buttonframe'
-
- # Now, Click on the button
-driver.find_element(:tag_name,'button').click
- {{< /tab >}}
- {{< tab header="JavaScript" >}}
-// Using the ID
-await driver.switchTo().frame('buttonframe');
+
+{{< tab header="Ruby" text=true >}}
+{{< gh-codeblock path="examples\ruby\spec\interactions\frames_spec.rb#L24-L32" >}}
+{{< /tab >}}
-// Or using the name instead
-await driver.switchTo().frame('myframe');
-// Now we can click the button
-await driver.findElement(By.css('button')).click();
- {{< /tab >}}
{{< tab header="Kotlin" >}}
//Using the ID
driver.switchTo().frame("buttonframe")
@@ -174,20 +156,23 @@ consultado usando _window.frames_ em JavaScript.
{{< tab header="Java" text=true >}}
{{< gh-codeblock path="examples/java/src/test/java/dev/selenium/interactions/FramesTest.java#L62-L63" >}}
{{< /tab >}}
- {{< tab header="Ruby" >}}
- # Switch to the second frame
-driver.switch_to.frame(1)
- {{< /tab >}}
- {{< tab header="CSharp" text=true >}}
-{{< gh-codeblock path="examples/dotnet/SeleniumDocs/Interactions/FramesTest.cs#L62-L63" >}}
-{{< /tab >}}
- {{< tab header="Python" >}}
+ {{< tab header="Python" >}}
# switching to second iframe based on index
iframe = driver.find_elements(By.TAG_NAME,'iframe')[1]
# switch to selected iframe
driver.switch_to.frame(iframe)
{{< /tab >}}
+
+ {{< tab header="CSharp" text=true >}}
+{{< gh-codeblock path="examples/dotnet/SeleniumDocs/Interactions/FramesTest.cs#L62-L63" >}}
+{{< /tab >}}
+
+ {{< tab header="Ruby" text=true >}}
+{{< gh-codeblock path="examples\ruby\spec\interactions\frames_spec.rb#L34-L36" >}}
+{{< /tab >}}
+
+
{{< tab header="JavaScript" >}}
// Switches to the second frame
await driver.switchTo().frame(1);
@@ -215,10 +200,9 @@ driver.switch_to.default_content()
{{< tab header="CSharp" text=true >}}
{{< gh-codeblock path="examples/dotnet/SeleniumDocs/Interactions/FramesTest.cs#L66-L67" >}}
{{< /tab >}}
- {{< tab header="Ruby" >}}
- # Return to the top level
-driver.switch_to.default_content
- {{< /tab >}}
+ {{< tab header="Ruby" text=true >}}
+{{< gh-codeblock path="examples\ruby\spec\interactions\frames_spec.rb#L38-L40" >}}
+{{< /tab >}}
{{< tab header="JavaScript" >}}
// Return to the top level
await driver.switchTo().defaultContent();
diff --git a/website_and_docs/content/documentation/webdriver/interactions/frames.zh-cn.md b/website_and_docs/content/documentation/webdriver/interactions/frames.zh-cn.md
index af55faf58226..8de76aba8971 100644
--- a/website_and_docs/content/documentation/webdriver/interactions/frames.zh-cn.md
+++ b/website_and_docs/content/documentation/webdriver/interactions/frames.zh-cn.md
@@ -78,26 +78,11 @@ driver.find_element(By.TAG_NAME, 'button').click()
{{< tab header="CSharp" text=true >}}
{{< gh-codeblock path="examples/dotnet/SeleniumDocs/Interactions/FramesTest.cs#L38-L46" >}}
{{< /tab >}}
-{{< tab header="Ruby" >}}
- # Store iframe web element
-iframe = driver.find_element(:css,'#modal> iframe')
-
- # 切换到 frame
-driver.switch_to.frame iframe
- # 单击按钮
-driver.find_element(:tag_name,'button').click
+{{< tab header="Ruby" text=true >}}
+{{< gh-codeblock path="examples\ruby\spec\interactions\frames_spec.rb#L13-L22" >}}
{{< /tab >}}
-{{< tab header="JavaScript" >}}
-// 存储网页元素
-const iframe = driver.findElement(By.css('#modal> iframe'));
-
-// 切换到 frame
-await driver.switchTo().frame(iframe);
-// 现在可以点击按钮
-await driver.findElement(By.css('button')).click();
-{{< /tab >}}
{{< tab header="Kotlin" >}}
// 存储网页元素
val iframe = driver.findElement(By.cssSelector("#modal>iframe"))
@@ -129,23 +114,11 @@ driver.find_element(By.TAG_NAME, 'button').click()
{{< tab header="CSharp" text=true >}}
{{< gh-codeblock path="examples/dotnet/SeleniumDocs/Interactions/FramesTest.cs#L50-L58" >}}
{{< /tab >}}
-{{< tab header="Ruby" >}}
- # Switch by ID
-driver.switch_to.frame 'buttonframe'
- # 单击按钮
-driver.find_element(:tag_name,'button').click
+{{< tab header="Ruby" text=true >}}
+{{< gh-codeblock path="examples\ruby\spec\interactions\frames_spec.rb#L24-L32" >}}
{{< /tab >}}
-{{< tab header="JavaScript" >}}
-// 使用 ID
-await driver.switchTo().frame('buttonframe');
-
-// 或者使用 name 代替
-await driver.switchTo().frame('myframe');
-// 现在可以点击按钮
-await driver.findElement(By.css('button')).click();
-{{< /tab >}}
{{< tab header="Kotlin" >}}
// 使用 ID
driver.switchTo().frame("buttonframe")
@@ -168,13 +141,7 @@ _window.frames_ 进行查询.
{{< tab header="Java" text=true >}}
{{< gh-codeblock path="examples/java/src/test/java/dev/selenium/interactions/FramesTest.java#L62-L63" >}}
{{< /tab >}}
-{{< tab header="Ruby" >}}
- # 切换到第 2 个框架
-driver.switch_to.frame(1)
-{{< /tab >}}
- {{< tab header="CSharp" text=true >}}
-{{< gh-codeblock path="examples/dotnet/SeleniumDocs/Interactions/FramesTest.cs#L62-L63" >}}
-{{< /tab >}}
+
{{< tab header="Python" >}}
# 基于索引切换到第 2 个 iframe
iframe = driver.find_elements(By.TAG_NAME,'iframe')[1]
@@ -182,6 +149,17 @@ iframe = driver.find_elements(By.TAG_NAME,'iframe')[1]
# 切换到选择的 iframe
driver.switch_to.frame(iframe)
{{< /tab >}}
+
+
+ {{< tab header="CSharp" text=true >}}
+{{< gh-codeblock path="examples/dotnet/SeleniumDocs/Interactions/FramesTest.cs#L62-L63" >}}
+{{< /tab >}}
+
+ {{< tab header="Ruby" text=true >}}
+{{< gh-codeblock path="examples\ruby\spec\interactions\frames_spec.rb#L34-L36" >}}
+{{< /tab >}}
+
+
{{< tab header="JavaScript" >}}
// 切换到第 2 个框架
await driver.switchTo().frame(1);
@@ -208,10 +186,11 @@ driver.switch_to.default_content()
{{< tab header="CSharp" text=true >}}
{{< gh-codeblock path="examples/dotnet/SeleniumDocs/Interactions/FramesTest.cs#L66-L67" >}}
{{< /tab >}}
-{{< tab header="Ruby" >}}
- # 回到顶层
-driver.switch_to.default_content
+
+ {{< tab header="Ruby" text=true >}}
+{{< gh-codeblock path="examples\ruby\spec\interactions\frames_spec.rb#L38-L40" >}}
{{< /tab >}}
+
{{< tab header="JavaScript" >}}
// 回到顶层
await driver.switchTo().defaultContent();
diff --git a/website_and_docs/hugo.toml b/website_and_docs/hugo.toml
index fa46c474e1e2..ff367fd7b71a 100644
--- a/website_and_docs/hugo.toml
+++ b/website_and_docs/hugo.toml
@@ -6,7 +6,7 @@ enableRobotsTXT = true
# Will give values to .Lastmod etc.
enableGitInfo = true
-#ignoreErrors = ["error-remote-getjson"]
+ignoreErrors = ["error-remote-getjson"]
# Language settings
# contentDir = "content/en"
defaultContentLanguage = "en"