Многопоточность в Human Emulator Studio. Изолированные закладки.
Что такое изолированные закладки браузера мы уже писали ранее в статье Изолированные браузеры в закладках Human Emulator Studio . В этой статье мы подробнее разберём многопоточный запуск одного простого скрипта в разных закладках одного exe программы.
Итак, начнём по порядку. Первое что нужно сделать это выставить соответствующую настройку в программе для этого в настройках программы во вкладке Браузер ставим галочку Изолированные Браузеры в закладках.
Работа с server_tab в PHP.
Для работы с изолированными закладками используется переменная server_tab, с помощью которой мы и говорим программе в какой закладке нужно выполнить скрипт.
Далее подготовим, скрипт который будем запускать в закладках. Скрипт на php будет выглядеть так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
$xhe_host = "127.0.0.1:7010"; // The following code is required to properly run XWeb Human Emulator require("C:/XWeb Studio/Human Emulator Studio/Templates/xweb_human_emulator.php"); // запуск скрипта не из хуман эмулятор $PHP_Use_Trought_Shell=false; // получение параметра из командной строки $tab = $argv[1]; // задаём закладку с которой работает это скрипт XHEBaseObject::$server_tab = $tab; // выведем в окно запуска пхп echo 'работаем с закладкой №'.$tab; // переходим на яндекс $browser->navigate("yandex.ru"); // вводим в поле нужный $input->send_keyboard_input_by_name("text","закладка ".$tab, "20:40"); |
Что делает этот скрипт — выполняет навигацию на Яндекс, вбивает текст с номером закладки и нажимает на кнопку найти.
Стоит обратить внимание на строки $PHP_Use_Trought_Shell=false; и $tab = $argv[1];.
$PHP_Use_Trought_Shell=false; — этот параметр говорит о том, что скрипт будет запускаться не из программы. Если не выставить этот параметр как false, то скрипт не будет работать как надо.
$tab = $argv[1]; — это аргумент командной строки. Через него мы будем говорить программе в какой закладке запускать текущий скрипт.
Запуск этого скрипта можно выполнять из bat файла. Для этого в bat файле указываем путь к php, путь к php.ini, путь к скрипту на выполнение. Обязательное условие в программе должны быть заранее открыты необходимое количество закладок.
Всё это можно выполнить скриптом из Human Emulator Studio. Скрипт для запуска потоков на php :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
// задаём количество браузеров $cnt_browsers=5; // строка для бат файла $bat_str = ""; // папка с индикаторами $folder_done="done"; // задаём количество закладок $browser->set_count($cnt_browsers); // пауза на открытие sleep(5); // создаём нужное количество строк для бат файла for($i=0;$i<$cnt_browsers;$i++) { $bat_str .='start "php'.$i.'" "C:\XWeb Studio\Human Emulator Studio\PHP\php.exe" -c "C:\XWeb Studio\Human Emulator Studio\PHP\php.ini" -f "C:\XWeb Studio\Human Emulator Studio\My Scripts\multi\thread.php" '.$i."\r\n"; } // запишем bat файл $textfile->write_file("run.bat",$bat_str); // запустим на выполнение $app->shell_execute("run","run.bat"); |
Открываем нужное количество закладок в программе с помощью команды:
1 2 3 4 |
// задём количество закладок $browser->set_count($cnt_browsers); |
В обоих скриптах мы не используем функцию объекта app quit, так как выполнение этой команды прекратит выполнение всех скриптов. Обращаем ваше внимание на то, что скрипт запуска потоков в отдельных закладках не будет ждать завершения работы всех запущенных им скриптов, а выполнив запуск bat файла остановиться. Если вам надо из этого скрипта ожидать завершения выполнения всех скриптов, то для этого например можно использовать проверку на появление файлов.
Для ожидания завершения всех потоков из основного скрипта изменим наши скрипты следующим образом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
$xhe_host = "127.0.0.1:7010"; // The following code is required to properly run XWeb Human Emulator require("../../Templates/xweb_human_emulator.php"); // задаём количество браузеров $cnt_browsers=5; // строка для бат файла $bat_str = ""; // папка с индикаторами $folder_done="done"; // задаём количество закладок $browser->set_count($cnt_browsers); // пауза на открытие sleep(5); // создаём нужное количество строк для бат файла for($i=0;$i<$cnt_browsers;$i++) { $bat_str .='start "php'.$i.'" "C:\XWeb Studio\Human Emulator Studio\PHP\php.exe" -c "C:\XWeb Studio\Human Emulator Studio\PHP\php.ini" -f "C:\XWeb Studio\Human Emulator Studio\My Scripts\multi\thread.php" '.$i."\r\n"; } // запишем bat файл $textfile->write_file("run.bat",$bat_str); // запустим на выполнение $app->shell_execute("run","run.bat"); // проверка на файлы индикаторы завершения работы потоков $idone=0; while($idone<5) { $idone= $folder->get_items_count($folder_done); sleep(2); echo "завершено $idone потоков<br>"; } // удаляем все файлы индикаторы $folder->clear($folder_done); echo "все скрипты закончили свою работу!"; $app->quit(); |
скрипт для потока:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
$xhe_host = "127.0.0.1:7012"; // The following code is required to properly run XWeb Human Emulator require("C://XWeb Studio//Human Emulator Studio//Templates//xweb_human_emulator.php"); // папка с индикаторами $folder_done="done"; // запуск скрипта не из хуман эмулятор $PHP_Use_Trought_Shell=false; // получение параметра из командной строки $tab = $argv[1]; // задаём закладку с которой работает это скрипт XHEBaseObject::$server_tab = $tab; // выведем в окно запуска пхп echo 'работаем с закладкой №'.$tab; // переходим на яндекс $browser->navigate("yandex.ru"); // вводим в поле нужный $input->send_keyboard_input_by_name("text","закладка ".$tab, "20:40"); // найти $button->click_by_inner_text("Найти"); $span->click_by_inner_text("Найти"); // запишем файл индикатор завершения потока $textfile->write_file("$folder_done//done$tab.txt",""); |
Порт в скрипте должен совпадать с портом программы.
В Python и JavaScript делаем аналогичным образом, только скрипты соответственно выполняем на этих языках.
Работа с server_tab в C#.
Если в Python и JavaScript исполнение скриптов будет аналогично тому как это сделано в php, то в C# нам придётся использовать класс XHEScriptMulti.
В этом случае скрипт для одного потока будет выглядеть следующий образом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
#region using using System; using System.Diagnostics; using System.Collections.Generic; using System.Linq; using System.IO; using System.Text; using System.Threading; using System.Threading.Tasks; using XHE; using XHE.XHE_DOM; using XHE.XHE_System; using XHE.XHE_Window; using XHE.XHE_Web; #endregion class MyScript:XHEScript { static void Main(string[] args) { // папка с индекаторами string folder_done="done"; XHEScriptMulti multi = new XHEScriptMulti("127.0.0.1:7012"); // запуск скрипта не из хуман эмулятор XHEBaseObject.CSHARP_Use_Trought_Shell=false; // получение параметра из командной строки string tab = args[0]; // задаём закладку с которой работает это скрипт multi.server_tab = Convert.ToInt32(tab); // выведем в окно запуска пхп echo ("работаем с закладкой №"+tab); // переходим на яндекс multi.browser.navigate("yandex.ru"); // вводим в поле нужный multi.input.send_keyboard_input_by_name("text","закладка "+tab); // найти multi.button.click_by_inner_text("Найти"); multi.span.click_by_inner_text("Найти"); multi.textfile.write_file(folder_done+"//done"+tab+".txt",""); } } |
Этот скрипт нужно обязательно выполнить в программе, что бы в папке со скриптом появился exe файл thread.exe. В процессе выполнения возникнут ошибки, их надо будет просто проигнорировать.
Скрипт для запуска отдельных потоков в закладках. В отличие от php тут мы будем через команду объекта app shell_execute запускать exe скрипта для каждого потока — thread.exe. В качестве параметров зададим путь к скрипту debug.get_cur_script_folder()+»//thread.exe» и номер закладки в параметрах «0 «.
Скрипт для запуска потоков в закладках на C# будет таким:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
#region using using System; using System.Diagnostics; using System.Collections.Generic; using System.Linq; using System.IO; using System.Text; using System.Threading; using System.Threading.Tasks; using XHE; using XHE.XHE_DOM; using XHE.XHE_System; using XHE.XHE_Window; using XHE.XHE_Web; #endregion class MyScript:XHEScript { static void Main(string[] args) { // init XHE server = "127.0.0.1:7012"; InitXHE(); // задаём количество браузеров int cnt_browsers=5; // папка с индикаторами string folder_done="done"; // задаём количество закладок browser.set_count(cnt_browsers); // пауза на открытие sleep(5); // запускаем на выполнение app.shell_execute("open",debug.get_cur_script_folder()+"//thread.exe","0 ","",0); sleep(1); app.shell_execute("open",debug.get_cur_script_folder()+"//thread.exe","1 ","",0); sleep(1); app.shell_execute("open",debug.get_cur_script_folder()+"//thread.exe","2 ","",0); sleep(1); app.shell_execute("open",debug.get_cur_script_folder()+"//thread.exe","3 ","",0); sleep(1); app.shell_execute("open",debug.get_cur_script_folder()+"//thread.exe","4 ","",0); sleep(1); // проверка на файлы индикаторы завершения работы потоков int idone=0; while(idone<5) { idone= folder.get_items_count(folder_done); sleep(2); echo ("завершено "+idone.ToString()+" потоков<br>"); } // удаляем все файлы индикаторы folder.clear(folder_done); echo ("все скрипты закончили свою работу!"); // exit app.quit(); } } |
В результате работы скрипта увидим следующую картинку:
Обсудить статью и скачать примеры можно на нашем форуме
Добавить комментарий
Для отправки комментария вам необходимо авторизоваться.