【问题标题】:WebDriver claiming editable element is not editable声称可编辑元素的 WebDriver 不可编辑
【发布时间】:2013-05-20 00:18:53
【问题描述】:

我正在使用 Selenium WebDriver 和 Python 运行一个简单的测试来发送/验证电子邮件的接收。

一旦我切换到包含消息正文的 iframe 并找到可编辑的正文元素并尝试将其清除,就会引发以下异常:

Traceback (most recent call last):
driver.find_element_by_xpath("//body[@role='textbox']").clear()
selenium.common.exceptions.WebDriverException: Message: 'Element must be user-editable in order to clear it.'

这是用于创建电子邮件的脚本:

driver.find_element_by_name("to").clear()
driver.find_element_by_name("to").send_keys("toemailaddy@gmail.com")
localtime = time.asctime( time.localtime(time.time()) )
subj = ("TEST - " + localtime)
print(subj)
driver.find_element_by_name("subjectbox").clear()
driver.find_element_by_name("subjectbox").send_keys(subj)
body = ("TEST")
bodyFrame = driver.find_element_by_xpath("//td[@class='Ap']//iframe")
driver.switch_to_frame(bodyFrame)
driver.find_element_by_xpath("//body[@role='textbox']").clear()
driver.find_element_by_xpath("//body[@role='textbox']").send_keys(body)
driver.find_element_by_xpath("/div[@role='button' and contains(text(), 'Send')]").click()
driver.find_element_by_link_text("Inbox (1)").click()

但是,消息正文是明确的用户可编辑的。下面我包含了消息正文 HTML 的 sn-p,我将 WebDriver 定向到嵌套在 td 类“Ap”中的 iframe 中,明确表明它是可编辑的。

<body id=":3" class="editable LW-avf" style="min-width: 0px; width: 437px; 
border: 0px none; margin: 0px; background: none repeat scroll 0% 0% transparent;
height: 100%; overflow: hidden; direction: ltr; min-height: 121px;" hidefocus="true" 
g_editable="true" role="textbox">

IDE 能够访问所有元素,但是是什么阻止了 WebDriver 访问它们?

编辑

好吧,我刚刚发现了导致异常的原因:

我发现通过从脚本中删除以下行允许 WebDriver 在文本框中写入。

driver.find_element_by_xpath("//body[@role='textbox']").clear()

虽然我想知道为什么它会抛出元素必须是可编辑的异常,但允许它毫无问题地向元素发送_keys?

【问题讨论】:

    标签: python selenium python-3.x webdriver


    【解决方案1】:

    你试过Action Chains吗?

    from selenium.webdriver import ActionChains
    from selenium.webdriver.common.keys import Keys
    
    driver.switch_to_frame(bodyFrame)
    
    ActionChains(driver).send_keys(Keys.CONTROL, "a").perform()
    ActionChains(driver).send_keys("Test").perform()
    
    # alternative:
    # body_ele = driver.find_element_by_xpath("//body[@role='textbox']")
    # body_ele.send_keys(Keys.CONTROL, 'a')
    # body_ele.send_keys("Test")
    

    在 C# 中,IWebElement.Clear 表示“如果此元素是文本输入元素,则 Clear() 方法将清除该值。它对其他元素没有影响。文本输入元素定义为带有 INPUT 或 TEXTAREA 标签的元素."。同样,在python source code 中,它说“如果它是文本输入元素,则清除文本。”,而在您的情况下,body 不是文本输入元素。

    【讨论】:

    • 我能够让它工作,但现在实际点击“发送”按钮时遇到问题。如果我 switch_to_default_content 它找不到它,但没有可识别的 iframe 或框架包含“发送”按钮(或整体消息)。我正在尝试使用 ActionChains send_keys(以及 key_down/key_up 的变体) 改为尝试 CTRL+Enter 发送消息,而不是使用发送按钮,但它似乎不起作用。
    • @Keith:发布 DOM 会很有帮助(主体的 iframe 和发送按钮),如果网站可以公开访问,效果会更好。
    • @Keith:你试过ActionChains(driver).send_keys(Keys.CONTROL, Keys.ENTER)吗?
    【解决方案2】:

    当我收到此错误时,我所做的是查看源代码页面并验证该元素名称是否事先使用了不同的标签。 (即“标签”,而不是“输入”) Selenium 将始终从页面顶部开始选择满足其要求的第一个元素。

    我会使用 CSS 调用而不是 xpath。更精确地了解您想要在正文中调用的内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-09
      • 1970-01-01
      • 2013-05-29
      • 1970-01-01
      • 2021-05-20
      • 2011-05-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多