2017-07-16 1 views
1

Ich automatisiere den Autoraptor CRM mit Splitter und alles lief glatt, bis es Zeit kam, eine Nachricht zu verfassen. Der E-Mail-Editor des CRM befindet sich in einem Iframe. Ich kann das iframe mit Splitter finden, aber ich kann es nicht bekommen, irgendetwas im Redakteur zu schreiben.Python Splitter füllen Text innerhalb iframe


Hier ist der 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> 

I Frames, alerts and prompts

hier gelesen haben, ist die 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() 

Hier ist die Zurückverfolgungs

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

Bitte geben Sie Ihren Code ein. Was passiert, wenn Sie es versuchen? – Guy

+0

Anstatt das Element innerhalb des Iframes zu löschen, können Sie es zuerst auswählen? Holen Sie sich den Inhalt? Wenn nicht, ist der Wechsel zu iframe nicht erfolgreich und darauf müssen Sie sich konzentrieren. –

Antwort

0

Der Grund für die Ausnahme ist, dass IFrames nicht in selbst eingegeben werden, wenn die HTML5 contenteditable="true" zuzuschreiben. Wenn Sie die Kontrolle über den HTML-Code haben, versuchen Sie es unten und Sie werden sehen, dass Sie einen Absatz tatsächlich bearbeiten können, wenn er das obige Attribut aufweist. Was Sie möglicherweise tun könnten, wenn der HTML-Code außerhalb Ihrer Kontrolle ist, finden Sie ein Element innerhalb der Iframe (wenn es einen gibt), mit denen Sie damit interagieren können. Wenn sich im Iframe keine Elemente befinden, müssen Sie auf einen Maus-/Tastatur-Controller zurückgreifen, um mit dem Iframe zu interagieren, was bedeutet, dass Sie die Maus bewegen und Tastatureingaben simulieren.

<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

Ich habe keine Kontrolle über die HTML die CRM gehört von einer dritten Partei https://www.autoraptor.com/ –

+0

Vielleicht könnte ich einen Proxy schreiben könnte die Tamper mit dem HTML. –

+0

Jetzt den Proxy schreiben –