WebDriver声称可编辑元素不可编辑

时间:2013-05-20 00:18:53

标签: python selenium python-3.x webdriver

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

一旦切换到包含邮件正文的iframe并找到可编辑的body元素并尝试清除它,就会引发以下异常:

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的片段,我将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()

虽然我想知道为什么它会抛出该元素必须是可编辑的异常,但允许它将send_keys发送到元素而没有问题?

2 个答案:

答案 0 :(得分:2)

您是否尝试过使用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不是文本输入元素。

答案 1 :(得分:0)

当我收到此错误时,我所做的就是查看源代码页并使用其他标记验证该元素名称是否已事先确定。 (即&#39;标签&#39;,而不是&#39;输入&#39;) Selenium将始终从页面顶部开始挑选满足其要求的第一个元素。

我会使用CSS调用而不是xpath。你想要的身体更精确。