2015-06-03 3 views
2

У меня есть устройство, плата из четырех программируемых электрических разъемов, если быть точным. Интерфейс устройства с ПК находится через порт TCP/IP. Устройство имеет пользовательский интерфейс веб-браузера, доступный на локальном IP-адресе.отправка команды javascript из оболочки python

На странице интерфейса интерфейса Javascript есть код Javascript, который, как я полагаю, делает интерактивную веб-страницу и определяет поведение страницы. Во-первых, могу ли я отправить Javascript-команды из Python для переключения сокетов с помощью веб-интерфейса (если у меня есть TCP/IP-соединение с сервером, открытым из Python.) Поэтому для этого мне нужно будет вызвать функцию Javascript в оболочке Python. Как это сделать? Во-вторых, мне нужен comet в этом случае, потому что мне нужно нажать Javascript-команду на определенный IP-адрес и порт из Python.

Вот мой питон код:

import socket 
import time 
TCP_IP = 'xxx.xxx.y.zzz' 
TCP_PORT = wwww 
MESSAGE1 = "xxx.xxx.y.zzz/"; 
MESSAGE2 = "javascript: ChangeState('1')" 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((TCP_IP, TCP_PORT)) 
s.send(MESSAGE1) 
s.send(MESSAGE2) 
s.close() 

и это Java-функция:

function ChangeState(sn) { 
    f = document.forms.tForm; 
    ind = sn * 1 - 1; 
    f["cte" + sn].value = Math.abs(1 - sockstates[ind]); 
    f.submit(); 
} 
function ActivateDeactivate() { 
    f = document.forms.tForm2; 
    f["activate"].value = actbtn; 
    f.submit(); 
} 
function TimerFunction() { 
    clearTimeout(timer); 
    if (trycon == 1 && active == 1) { 
    document.location.href = "xyz.html"; 
    } 
} 
function StartTimer() { timer = setTimeout(TimerFunction, period); } 
window.onload = function() { 
    for (i = 0; i < 4; i++) { 
    if (sockstates[i] == 0) { 
     clsname = 'offstate'; 
     str1 = 'OFF'; 
     str2 = 'ON'; 
    } else { 
     clsname = 'onstate'; 
     str1 = 'ON'; 
     str2 = 'OFF'; 
    } 
    strhtml = '<span class="' + clsname + '">' + str1 + 
       '</span>&nbsp;<a href="javascript: ChangeState(\'' + (i + 1) + 
       '\')" class="onoffbtn">' + str2 + '</a>'; 
    el = document.getElementById('stCont' + i); 
    el.innerHTML = strhtml; 
    } 
    statA = ''; 
    statB = ''; 
    statC = ''; 
    rmsg = ''; 
    if (ipid != 0) { 
    statA = "Registered - "; 
    tmpel = document.getElementById('regBtn'); 
    tmpel.innerHTML = 'Login'; 
    } else { 
    rmsg = "Register to manage AB-xyz-LAN from Internet (free service)"; 
    } 
    if (active == 1) { 
    statB = "Activated - "; 
    } else { 
    statB = "Not activated"; 
    } 
    if (active == 1) { 
    if (trycon == 1) { 
     statC = "Trying to connect"; 
    } else if (serv == 1) { 
     statC = "Connected"; 
    } else if (serv == 0) { 
     statC = "Not connected"; 
    } 
    } 
    statAel = document.getElementById('statusA'); 
    statAel.innerHTML = statA; 
    statBel = document.getElementById('statusB'); 
    statBel.innerHTML = statB; 
    statCel = document.getElementById('statusC'); 
    statCel.innerHTML = statC; 
    rmsgel = document.getElementById('regmsg'); 
    rmsgel.innerHTML = rmsg; 
    actBtnEl = document.getElementById("actBtn"); 
    if (actbtn == 1) { 
    actBtnEl.innerHTML = 'Activate'; 
    } else { 
    actBtnEl.innerHTML = 'Deactivate'; 
    } 
    regBtnEl = document.getElementById("regBtn"); 
    regBtnEl.href = "http://www.example.com/user/register.aspx?mac=" + mac; 
    if (warn == 1) { 
    alert("Failed to connect. Please, check DNS server settings."); 
    } 
    if (warn == 2) { 
    alert("Failed to activate. Please, check, that device is registered."); 
    } 
    StartTimer(); 
} 
+0

Если вы хотите, чтобы ваш скрипт Python маскировался как браузер и запускал функцию JavaScript, вам, вероятно, понадобится полноценная среда браузера и движок JavaScript в Python, что будет довольно тяжелым требованием для вашей задачи. Можете ли вы прочитать исходный код этой функции «ChangeState» и посмотреть, что он делает? Вероятно, это просто запрос на определенный маршрут на веб-сервере, который запускает действие на аппаратном обеспечении. Надеюсь, гораздо проще перенести эту функцию на Python. –

+0

Я немного очистил код для вас (не уверен, что он пришел без перерывов или если это было просто неудачное пастовое задание). Похоже, что 'ChangeState (1)' захватывает HTML-форму под названием 'tForm', устанавливая одну из своих записей в' Math.abs (1 - sockstate [0]) 'и отправляя эту форму. У HTML есть какие-либо признаки того, что происходит, когда этот 'tForm' отправлен? –

+0

большое спасибо. @AhmedFasih. Но моя проблема в том, какие команды (возможно, Javascript) мне нужно отправить из Python Shell, чтобы переключать мои сокеты по моей воле. – JosephAgnes

ответ

1

Я предложил бы использовать Selenium и ее Python bindings, что позволит вам контролировать экземпляр браузера от Python. Это позволит вам щелкнуть кнопку или вызвать функцию Javascript из вашего сценария Python.

Ваш сценарий будет включать в себя код, как это:

from selenium import webdriver 
from selenium.webdriver.common.keys import Keys 

driver = webdriver.Firefox() 
driver.get("http://xx.yy.zz") 
elem = driver.find_element_by_name("interesting_button") 
elem.send_keys(Keys.RETURN) 

Это поможет вам решение. Однако это немного хаки. Более элегантное решение состоит в том, чтобы выяснить, что делают функции Javascript за кулисами. Вероятно, они вызовут другой код или отправят сообщение слушателю. У изготовителя может быть API, который позволит вам использовать библиотеку Python, такую ​​как urllib, для вызова API. Или они могут иметь спецификации о том, как связаться с устройством по RS-232 (последовательный). Я бы попробовал поиск Google для устройства make/model с некоторыми из этих ключевых слов и посмотреть, что происходит.

+0

благодарит производителя имеют API, и, к сожалению, они не готовы к сотрудничеству и руководствуются тем, что я использую другой подход, чем они предоставили.Руководство пользователя с прибором - одно из самых сложных статей руководства, которое я встречал в своей жизни. – JosephAgnes

+0

@Ahmed Fasih спасибо, я пытаюсь все еще разобраться. Это не принципиально сложно, но я не являюсь парнем в области веб-разработки, а скорее ориентирован на аппаратные языки. – JosephAgnes

+0

Понял. Тем не менее, код выше - это все, что вам нужно, помимо выяснения, какую «интересную кнопку» вы хотите нажать. Я думаю, что использование кометы может быть излишним для этого приложения. – charlesreid1

Смежные вопросы