SendKeys 到富文本编辑器 Selenium?
SendKeys to Rich Text editor Selenium?
不知是否有人可以帮助我。我找不到在我的应用程序上 'sendkeys' 富文本编辑器(描述)的方法。代码如下:
https://i.stack.imgur.com/sk6Xg.png
该页面包含一个 iframe,因此您需要先切换到该框架,然后才能与其中的元素进行交互。我看到您正在使用 TinyMCE...这是一个示例测试,它使用 SeleniumBase 框架在 TinyMCE 编辑器的 iframe 中输入文本:
https://github.com/seleniumbase/SeleniumBase/blob/master/examples/test_tinymce.py
对运行的例子,调用pip install seleniumbase
,然后运行的例子用pytest
。
from seleniumbase import BaseCase
class TinyMceTests(BaseCase):
def test_tinymce(self):
self.open("https://seleniumbase.io/tinymce/")
self.wait_for_element("div.mce-container-body")
self.click('span:contains("File")')
self.click('span:contains("New document")')
self.click('span:contains("Paragraph")')
self.click('span:contains("Heading 2")')
self.switch_to_frame("iframe")
self.add_text("#tinymce", "Automate anything with SeleniumBase!\n")
self.switch_to_default_content()
self.click("button i.mce-i-image")
self.type('input[aria-label="Width"].mce-textbox', "300")
image_url = "https://seleniumbase.io/img/sb_logo_10.png"
self.type("input.mce-textbox", image_url + "\n")
self.switch_to_frame("iframe")
self.click("h2")
self.switch_to_default_content()
self.post_message("Automate anything with SeleniumBase!")
self.click('span:contains("File")')
self.click('span:contains("Preview")')
self.switch_to_frame('iframe[sandbox="allow-scripts"]')
self.post_message("Learn SeleniumBase Today!")
等待 OP 提供更多信息,这就是我认为您的 Java 代码有问题的地方。我注意到您突出显示了您认为是您正尝试向其发送击键的富文本框。但是,这很可能不是包含文本的元素。在其下方,您会看到一个 iframe
。除非您切换到特定的 iframe,否则您将无法与之交互。切换到 iframe 的一种简单方法是:
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10)); // New convention for setting explicit waits in Selenium
WebDriverWait wait = new WebDriverWait(driver, 10); // Old convention equivalent to line above
wait.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.id("WHATEVER"))); // You can also search by `By.xpath(...)` or some other acceptable criteria like CSS, name, etc.
这里的超时时间是任意的。这可能比您需要的时间长得多,而且对于您的问题来说并不是那么重要。发挥价值,直到找到更适合您需求的价值。成功切换到 iframe 后,您应该能够向该元素发送击键。 <html>
标签内的元素之一应该是您的目标。
WebElement elementInsideIframe = driver.findElement(...);
elementInsideIframe.sendKeys("TEST 123ABC");
如果您需要对文本区域执行任何其他操作(例如将文本设置为粗体),我认为最好的方法是使用 JavaScript 命令。这似乎超出了 post 的范围。最后,一旦你完成设置键,你必须切换回父框架!!!如果不这样做将导致 Selenium 代码失败与正常框架中的组件交互,因为它认为它仍在与 iframe 交互。打开新标签和切换标签以与那里的内容进行交互也是如此。对于标签,您需要保存 Window 个句柄并使用这些句柄来回切换。同样,超出本次讨论的范围(但我希望您了解这一点,因为您似乎不了解 iframe 以及如何切换到它们)。
driver.switchTo().parentFrame();
如果您将这些行放在一起并填写缺失的信息来为您的应用程序找到 iframe 和文本区域,它应该可以正常工作。也就是说,考虑到您的其余代码是正确的(我们还没有看到)。
不知是否有人可以帮助我。我找不到在我的应用程序上 'sendkeys' 富文本编辑器(描述)的方法。代码如下:
https://i.stack.imgur.com/sk6Xg.png
该页面包含一个 iframe,因此您需要先切换到该框架,然后才能与其中的元素进行交互。我看到您正在使用 TinyMCE...这是一个示例测试,它使用 SeleniumBase 框架在 TinyMCE 编辑器的 iframe 中输入文本:
https://github.com/seleniumbase/SeleniumBase/blob/master/examples/test_tinymce.py
对运行的例子,调用pip install seleniumbase
,然后运行的例子用pytest
。
from seleniumbase import BaseCase
class TinyMceTests(BaseCase):
def test_tinymce(self):
self.open("https://seleniumbase.io/tinymce/")
self.wait_for_element("div.mce-container-body")
self.click('span:contains("File")')
self.click('span:contains("New document")')
self.click('span:contains("Paragraph")')
self.click('span:contains("Heading 2")')
self.switch_to_frame("iframe")
self.add_text("#tinymce", "Automate anything with SeleniumBase!\n")
self.switch_to_default_content()
self.click("button i.mce-i-image")
self.type('input[aria-label="Width"].mce-textbox', "300")
image_url = "https://seleniumbase.io/img/sb_logo_10.png"
self.type("input.mce-textbox", image_url + "\n")
self.switch_to_frame("iframe")
self.click("h2")
self.switch_to_default_content()
self.post_message("Automate anything with SeleniumBase!")
self.click('span:contains("File")')
self.click('span:contains("Preview")')
self.switch_to_frame('iframe[sandbox="allow-scripts"]')
self.post_message("Learn SeleniumBase Today!")
等待 OP 提供更多信息,这就是我认为您的 Java 代码有问题的地方。我注意到您突出显示了您认为是您正尝试向其发送击键的富文本框。但是,这很可能不是包含文本的元素。在其下方,您会看到一个 iframe
。除非您切换到特定的 iframe,否则您将无法与之交互。切换到 iframe 的一种简单方法是:
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10)); // New convention for setting explicit waits in Selenium
WebDriverWait wait = new WebDriverWait(driver, 10); // Old convention equivalent to line above
wait.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.id("WHATEVER"))); // You can also search by `By.xpath(...)` or some other acceptable criteria like CSS, name, etc.
这里的超时时间是任意的。这可能比您需要的时间长得多,而且对于您的问题来说并不是那么重要。发挥价值,直到找到更适合您需求的价值。成功切换到 iframe 后,您应该能够向该元素发送击键。 <html>
标签内的元素之一应该是您的目标。
WebElement elementInsideIframe = driver.findElement(...);
elementInsideIframe.sendKeys("TEST 123ABC");
如果您需要对文本区域执行任何其他操作(例如将文本设置为粗体),我认为最好的方法是使用 JavaScript 命令。这似乎超出了 post 的范围。最后,一旦你完成设置键,你必须切换回父框架!!!如果不这样做将导致 Selenium 代码失败与正常框架中的组件交互,因为它认为它仍在与 iframe 交互。打开新标签和切换标签以与那里的内容进行交互也是如此。对于标签,您需要保存 Window 个句柄并使用这些句柄来回切换。同样,超出本次讨论的范围(但我希望您了解这一点,因为您似乎不了解 iframe 以及如何切换到它们)。
driver.switchTo().parentFrame();
如果您将这些行放在一起并填写缺失的信息来为您的应用程序找到 iframe 和文本区域,它应该可以正常工作。也就是说,考虑到您的其余代码是正确的(我们还没有看到)。