1

メールの受信を送信/確認するために、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()

ただし、メッセージ本文はユーザーが明示的に編集できます。以下に、編集可能であることを明示的に示す td クラス「Ap」にネストされた iframe 内に WebDriver を送信したメッセージ本文 HTML のスニペットを含めました。

<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 を許可するのはなぜだろうか?

4

2 に答える 2

2

アクションチェーンを試しましたか?

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はテキスト入力要素ではありません。

于 2013-05-20T00:32:06.543 に答える
0

このエラーが発生したとき、私が行ったことは、ソース コード ページを見て、その要素名が事前に別のタグを使用していたかどうかを確認することです。(つまり、'input' ではなく 'label') Selenium は常に、ページの先頭から始まる要件を満たす最初の要素を選択します。

xpath の代わりに CSS 呼び出しを使用します。体内で呼び出したいものをより正確に。

于 2014-10-24T23:12:45.510 に答える