【问题标题】:SendKeys to Rich Text editor Selenium? [closed]SendKeys 到富文本编辑器 Selenium? [关闭]
【发布时间】:2022-01-11 16:58:25
【问题描述】:

我想知道是否有人可以帮助我。我找不到在我的应用程序上向富文本编辑器(描述)“发送密钥”的方法。代码如下:

https://i.stack.imgur.com/sk6Xg.png

【问题讨论】:

  • 实际的 DOM 是什么样的?你的 JAVA 代码在哪里?您尝试过什么,遇到的具体错误是什么?
  • 请阅读为什么screenshot of HTML or code or error is a bad idea。考虑使用基于格式化文本的相关 HTML、代码试验和错误堆栈跟踪来更新问题。
  • 你能用相关的 HTML 和代码试验更新问题吗?

标签: java selenium sendkeys rich-text-editor


【解决方案1】:

等待 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 命令。这似乎超出了这篇文章的范围。最后,一旦您完成了键的设置,您必须切换回父框架!!!如果不这样做,将导致 Selenium 代码无法与正常框架,因为它认为它仍在与 iframe 交互。打开新标签和切换标签以与那里的内容交互也是如此。对于标签,您需要保存窗口句柄并使用这些句柄来回切换。同样,超出了本次讨论的范围(但我希望您注意这一点,因为您似乎不了解 iframe 以及如何切换到它们)。

driver.switchTo().parentFrame();

如果您将这些行放在一起并填写缺少的信息以定位您的应用程序的 iframe 和文本区域,它应该可以正常工作。也就是说,考虑到您的其余代码是正确的(我们还没有看到)。

【讨论】:

  • 无法切换到 iframe。 WebDriverWait 等待 = new WebDriverWait(驱动程序, 10); wait.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.id("tinyMce1641927583407_ifr")));
  • 这很可能意味着 iframe 不可用。如果不查看页面的行为,很难判断。您需要更新(编辑)您的帖子并添加之前请求的所有信息。我们正在努力帮助您完全失明。这些都是难以盲目诊断的问题。
  • 这个答案很完美。 @MihaiNicorec 尝试使用 WebDriverWait wait = new WebDriverWait(driver, 10); wait.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.xpath("//iframe[starts-with(@id, 'tinyMce') and contains(@id, 'ifr')]")));
  • 感谢@undetectedSelenium 的认可和支持(我假设)
  • 兄弟你是国王 :))))))。它的工作!非常感谢。但为什么它没有像我制作的那样工作?
【解决方案2】:

该页面包含一个 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!")

【讨论】:

  • 这是一篇 Selenium Java 帖子,而不是 Python。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-04
  • 2010-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多