Ich bin Niamugi, der für den zweiten Tag des [enebularen Adventskalenders 2019] verantwortlich ist (https://qiita.com/advent-calendar/2019/enebular). Dieses Mal möchte ich Ihnen zeigen, wie Sie automatisch auf http://enebular.com/app zugreifen und den Flow auslösen können.
Schaben
Der von enebular erstellte Node-RED-Flow wird schließlich auf einem Gerät oder Dienst bereitgestellt. Obwohl es einen Fluss auf enebular gibt, ist es eine Verschwendung, ihn nicht zu benutzen ... Kann der Flow verwendet werden, wenn er automatisch geöffnet und ausgeführt werden kann? Ich dachte, ich habe es versucht.
Das Klicken auf die Schaltfläche des Injektionsknotens "Start" ist ein Ablauf, der nur GCP-Cloud-Funktionen mit einer http-Anforderung ausführt.
Wir werden Schritt für Schritt von dem Ort aus untersuchen, an dem die Webseite geöffnet wird. Das Programm ist in Python geschrieben, das leicht zu kratzen ist.
WebDriverWait(driver, 5).until(ec.element_to_be_clickable((By.NAME, "email")))
Geben Sie beim Öffnen Ihre E-Mail-Adresse und Ihr Passwort ein und drücken Sie die Eingabetaste.
id = driver.find_element_by_name("email")
id.send_keys(un)
password = driver.find_element_by_name("password")
password.send_keys(pw)
password.send_keys(Keys.ENTER)
assetNm = "testscraping"
assetPath = '//span[@data-testid="' + assetNm +'"]'
WebDriverWait(driver, 5).until(ec.element_to_be_clickable((By.XPATH, assetPath)))
Klicken Sie auf das Asset, wenn es angezeigt wird.
driver.find_element_by_xpath(assetPath).click()
editBtn = '//button[@data-testid="btn-edit-flow"]'
WebDriverWait(driver, 5).until(ec.element_to_be_clickable((By.XPATH, editBtn)))
Klicken Sie auf die Schaltfläche Bearbeiten, wenn sie angezeigt wird.
driver.find_element_by_xpath(editBtn).click()
Klicken Sie auf die Schaltfläche Bearbeiten, um den Ablauf auf einer separaten Registerkarte anzuzeigen. Daher ist es notwendig, die Registerkarten zu wechseln.
handle_array = driver.window_handles
driver.switch_to.window(handle_array[1])
** Dies ist die größte Herausforderung. ** **. Zunächst wird "Laden ..." angezeigt.
Als nächstes wird der Rahmen zum Bearbeiten des Flusses angezeigt. ** Zu diesem Zeitpunkt wird die Registerkarte "Fluss" noch nicht angezeigt. ** ** ** Nach einer Weile werden die Flussregisterkarten (Dummy und diesmal Eingabe) angezeigt.Da die Frame-Anzeige und das Timing der Registerkartenanzeige unterschiedlich sind, ist ein gewisser Einfallsreichtum erforderlich. Das Problem wurde gelöst, indem das Laden von Frames wiederholt wurde, bis der Flow korrekt angezeigt wurde (= Registerkarten wurden angezeigt). (Es ist nicht gut, mit "while True" zu warten ... Sie sollten ein Zeitlimit haben ...)
flowNm = 'input'
frame = '//div[@id="iframeBlock"]/iframe'
flowPath = '//a[@title="' + flowNm + '"]'
# Loading...Warten Sie bis zum Ende
WebDriverWait(driver, 30).until(ec.frame_to_be_available_and_switch_to_it((By.XPATH, frame)))
#Warten Sie, bis der Durchfluss vollständig angezeigt wird
while True:
#Machen Sie den Rahmen rückgängig
driver.switch_to.default_content()
#Frames wechseln
iframe = driver.find_element_by_xpath(frame)
driver.switch_to_frame(iframe)
try:
#Ausnahme, wenn der Fluss nicht korrekt angezeigt wird
WebDriverWait(driver, 1).until(ec.visibility_of_element_located((By.XPATH, flowPath)))
break
except:
pass
Klicken Sie auf die Registerkarte, wenn sie angezeigt wird.
driver.find_element_by_xpath(flowPath).click()
triggerNodeNm = 'start'
try:
#Auf Leinwand verschieben
workspace = driver.find_element_by_id('workspace')
chart = workspace.find_element_by_id('chart')
canvas = chart.find_element_by_class_name('innerCanvas')
# class = "node nodegroup"Finden
nodes = canvas.find_elements_by_css_selector('.node.nodegroup')
#Überprüfen Sie, ob der Knotenname mit dem angegebenen übereinstimmt
#Wenn sie übereinstimmen, drücken Sie den Auslöser
for node in nodes:
nodeNm = node.find_element_by_tag_name('text').text
if nodeNm == triggerNodeNm:
node.find_element_by_class_name('node_button_button').click()
break
except Exception as e:
driver.quit()
Nach dem Drücken des Auslösers wird der Bildschirm geschlossen und der Vorgang beendet.
driver.quit()
Wenn Sie das Programm ausführen ... Die CloudFunctions-Funktion wurde ausgeführt!
Ich konnte den enebularen Fluss durch Schaben ausnutzen. Diese Methode kann ausreichend sein, wenn der Ablauf nicht von dem System oder der Schnittstelle abhängt, auf dem er bereitgestellt wird. (Es gibt ein Problem, dass es nicht funktioniert, wenn sich der Tag- oder Klassenname der Webseite ändert ...)
Ich hoffe, es gibt Ihnen einige Hinweise. Bis bald.
Recommended Posts