2017-07-16 73 views
1

我自動化了帶有碎片的autoraptor CRM,並且所有內容都運行平穩,直到編寫消息。 CRM的電子郵件編輯器位於iframe內。我可以找到帶有碎片的iframe,但我無法在編輯器中寫入任何內容。python splinter填寫iframe內的文本


下面是HTML

<div id="cke_1_contents" class="cke_contents cke_reset" role="presentation" style="height: 200px;"><span id="cke_67" class="cke_voice_label">Press ALT 0 for help</span><iframe src="" frameborder="0" class="cke_wysiwyg_frame cke_reset" title="Rich Text Editor, email_body" aria-describedby="cke_67" tabindex="0" allowtransparency="true" style="width: 100%; height: 100%;"></iframe></div> 

我已閱讀Frames, alerts and prompts

這裏是Python


#!/usr/bin/env python 

from splinter import Browser 
import urlparse 
import time 

# Creds 
username = "[email protected]" 
password = "spamspamspam..." 

login_url = 'https://ar.autoraptor.com/login' 

browser = Browser('chrome') 

#help(browser) 

# Go to login page 
browser.visit(login_url) 

# Fill in Username 
browser.find_by_name('login').fill(username) 

# Fill in 
browser.find_by_name('password').fill(password) 

# Click the login Button 
browser.find_by_value('Log In').click() 

# Navigate to upsheets 
#browser.find_by_xpath('//*[@id="nav"]/li[4]/a').click() 

# Navigate to least updated upsheets 
url = "https://ar.autoraptor.com/upsheets?filter=active&sort=updated_at%5B1%5D" 
browser.visit(url) 

# Click on notifications 
browser.find_by_xpath('//*[@id="nav"]/li[8]/div[1]').click() 
time.sleep(5) 

# Click on email 
browser.find_by_xpath('//*[@id="notification-tab-incoming_email"]/div').click() 
time.sleep(5) 

# Read email 
browser.find_by_text("Email from ").click() 

# Send email 
browser.find_by_id('newemailplaceholder').click() 
time.sleep(5) 
browser.find_by_id("cke_1_contents").fill("ftw") 
#browser.quit() 

這裏的回溯

Traceback (most recent call last): 
    File "testbot.py", line 50, in <module> 
    browser.find_by_id("cke_1_contents").find_by_tag("iframe").fill("foo") 
    File "/home/ricky/.local/lib/python2.7/site-packages/splinter/driver/webdriver/__init__.py", line 529, in fill 
    self.value = value 
    File "/home/ricky/.local/lib/python2.7/site-packages/splinter/driver/webdriver/__init__.py", line 511, in _set_value 
    self._element.clear() 
    File "/home/ricky/.local/lib/python2.7/site-packages/selenium/webdriver/remote/webelement.py", line 92, in clear 
    self._execute(Command.CLEAR_ELEMENT) 
    File "/home/ricky/.local/lib/python2.7/site-packages/selenium/webdriver/remote/webelement.py", line 493, in _execute 
    return self._parent.execute(command, params) 
    File "/home/ricky/.local/lib/python2.7/site-packages/selenium/webdriver/remote/webdriver.py", line 256, in execute 
    self.error_handler.check_response(response) 
    File "/home/ricky/.local/lib/python2.7/site-packages/selenium/webdriver/remote/errorhandler.py", line 194, in check_response 
    raise exception_class(message, screen, stacktrace) 
selenium.common.exceptions.InvalidElementStateException: Message: invalid element state: Element must be user-editable in order to clear it. 
    (Session info: chrome=59.0.3071.115) 
    (Driver info: chromedriver=2.30.477691 (6ee44a7247c639c0703f291d320bdf05c1531b57),platform=Linux 4.10.0-26-generic x86_64) 
+0

請張貼您的代碼。當你嘗試時會發生什麼? – Guy

+0

而不是清除iframe中的元素,可以先選擇它嗎?獲取它的內容?如果沒有,切換到iframe不成功,這就是你需要關注的。 –

回答

0

的原因的例外是的IFrame不能即使HTML5屬性contenteditable="true"鍵入。如果您對HTML有任何控制權,請嘗試下面的內容,如果它具有上述屬性,則會看到您可以實際編輯段落。如果HTML不在您的控制範圍內,您可以執行的操作是在的Iframe(如果有的話)內部找到一個允許您與之交互的元素。如果Iframe中沒有元素,那麼您將不得不求助於與Iframe交互的鼠標/鍵盤控制器手段,這意味着物理移動鼠標並模擬擊鍵。

<div id="cke_1_contents" class="cke_contents cke_reset" role="presentation" style="height: 200px;"> 
    <span id="cke_67" class="cke_voice_label">Press ALT 0 for help</span> 
    <iframe src="" frameborder="0" class="cke_wysiwyg_frame cke_reset" title="Rich Text Editor, email_body" aria-describedby="cke_67" tabindex="0" allowtransparency="true" style="width: 100%; height: 100%;"></iframe> 
     <p contenteditable="true">Begin with some text</p> 
</div> 
+0

我沒有任何控制HTML的crm是由第三方擁有的https://www.autoraptor.com/ –

+0

也許我可以寫一個代理可以篡改html。 –

+0

現在編寫代理 –