Nodejs: Работа в Selenium с Yandex браузер

Отличия при работе с Chrome минимальные. Достаточно скачать подходящий драйвер и подключаться подобным образом:

  var service = new chrome.ServiceBuilder(binary_yandex_driver_file).build();
  chrome.setDefaultService(service);
  let driver = await new Builder().forBrowser('chrome').setChromeOptions(chromeOptions).build();  

nmp — ошибка проверки самоподписанного сертификата

При установке модуля через nmp, иногда возникает ошибка вида:

reason: self-signed certificate in certificate chain

Причин возникновения её может быть множество. У меня например — из-за антивируса Касперского, который имеет свойство подпехивать свои сертификаты в промежуток трафика SSL. Что делать? Одним из решений может быть отключение у npm проверки подлинности SSL. Это конечно плохое решение, но в моём случае оказалось единственным вариантом

npm set strict-ssl false

Selenium: Запуск браузера хром в «скрытом» режиме

Аргумент запуска —headless хоть и работает, но многие сайты к сожалению работают в таком «скрытом» режиме не вполне корректно. Интернет говорит, что скорее всего дело в том, что браузер запускается с не понятным размером окна. Однако принудительное выставление размера, в моём случае не помогло. Решением оказалось запуск браузера «за пределами экрана». А именно что-то вроде:

chromeOptions.addArguments("--window-position=4000,0");

Пишем плагин для WordPress

Для того чтобы не изобретать велосипеды, необходимо с генерировать шаблоны файлов плагина. Например при помощи этого сервиса. В моём случае плагин называется ssk_read, поэтому далее везде фигурирует в названиях файлов он.

Получится структура папок вида:

Необходимо поместить все файлы в папку /wp_content/plugins..и собственно на этом моменте плагин уже будет доступен в админке для ативации.

Далее попробуем нарисовать страницу настроек в панели администрирования. Для этого добавим в /admin/class-ssk_read-admin.php в функцию конструкта класса хук добавления пункта меню:

add_action( 'admin_menu', 'register_my_config_page');

И далее в основном теле плагина skk_read.php добавим функцию register_my_config_page, которая непосредственно регистрирует этот пункт меню к выводу на экран:

function register_my_config_page(){
    add_menu_page( 'SSK_Read', 'SSK_Read', 'edit_others_posts','ssk_read', 'DrawPage', plugins_url( 'ssk_read/images/logo.png' ), 6 );
}
function DrawPage(){
 ?>
    <h1 class="wp-heading-inline">Основные настройки</h1>    
 <?php
};

После этого в меню админки появится новый пункт меню, с выводом пустой страницы. Добавим в функцию DrawPage функционал вывода сохраненных настроек:

function DrawPage(){
 ?>
    <h1 class="wp-heading-inline">Основные настройки</h1>
    <form method="post" action="options.php">
    <?php
        settings_fields('ssk_read_settings');
        do_settings_sections( 'ssk_read');
        submit_button();
    ?>
    </form>

 <?php
};

На этом этапе пока появится только кнопка «сохранить изменения», потому как мы еще не указали ядру, какие именно настройки мы хотим хранить. Для этого добавим в /admin/class-ssk_read-admin.php в функцию конструкта класса хук инициализации настроек:

add_action( 'admin_init', 'ssk_read_fields');

И далее в основном классе ssk_read.php добавим функции регистрации полей и их вывода:

function ssk_read_fields(){

    register_setting('ssk_read_settings','api_doc_url','string');
    register_setting('ssk_read_settings','api_doc_login','string');
    register_setting('ssk_read_settings','api_doc_password','string');

    add_settings_section( 'ssk_settings_section_id', 'Соединение с 1С Документооборот','', 'ssk_read' );

    add_settings_field('api_doc_url','URL вызова API','DrawApiTxtField','ssk_read','ssk_settings_section_id',array('name' => 'api_doc_url'));
    add_settings_field('api_doc_login','Логин','DrawApiTxtField','ssk_read','ssk_settings_section_id',array('name' => 'api_doc_login'));
    add_settings_field('api_doc_password','Пароль','DrawApiPasswordField','ssk_read','ssk_settings_section_id',array('name' => 'api_doc_password'));

}

function DrawApiTxtField($args){
    $value = get_option( $args[ 'name' ] );
    echo '<input type="text"  id="'.$args[ 'name' ].'" name="'.$args[ 'name' ].'" value="'.$value.'" />';
}
function DrawApiPasswordField($args){
    $value = get_option( $args[ 'name' ] );
    echo '<input type="password"  id="'.$args[ 'name' ].'" name="'.$args[ 'name' ].'" value="'.$value.'" />';
}

Получилось функционирующее сохранение:

Однако не хватает уведомления об успешном сохранении. Добавим хук:

add_action( 'admin_notices', 'ssk_custom_notice' );

И вывод сообщения:

function ssk_custom_notice(){
 if (
        isset( $_GET[ 'page' ] )
        && 'ssk_read' == $_GET[ 'page' ]
        && isset( $_GET[ 'settings-updated' ] )
        && true == $_GET[ 'settings-updated' ]
    ) {
        echo '<div class="notice notice-success is-dismissible"><p>Настройки сохранены!</p></div>';
    }
}

Диалоговое окно на чистом javascript

Задача: вывести диалоговое окно без использования Jquery

Решение:

<style>
.DialogConfirm{
    position: fixed;
    width: 100%;
    height: 100%;
    background: rgba(96, 79, 79, 0.51);
    top: 0px;
    left: 0px;
    right: 0px;
    bottom: 0px;
}

.DialogConfirm>div{
  width: 90%;
  margin: 30% auto;
  padding: 10px 20px;
  background: #f7f7f7;
  border-style: solid;
  border-color: aliceblue;
  border-width: initial;
}

.DialogConfirm div p{
  text-align:center;
}

.DialogConfirm div button{
    width: 40%;
    margin: 0 5%;
    border-style: double;
    border-color: black;
}    
</style>    
<script>
function myConfirm(text,buttons=Array(), cb){
    var body = document.getElementsByTagName('body')[0];
    var overlay = document.createElement('div');
    overlay.className = 'DialogConfirm';
    var box = document.createElement('div');  
    var p = document.createElement('p');
    p.appendChild(document.createTextNode(text));
    box.appendChild(p);
    buttons.forEach(function(bt, index, array) {
        tmp_btn=document.createElement('button');
        tmp_btn.appendChild(document.createTextNode(bt));
        tmp_btn.addEventListener('click', function(){ cb(bt); body.removeChild(overlay); }, false);
        box.appendChild(tmp_btn);
    });
        
    overlay.appendChild(box)
    body.appendChild(overlay);    
}
myConfirm('Бахнем и весь мир в труху?',["Давай","Попозжа"], function(value){ console.log(value); });   
</script>    
1 9 10 11 12 13 56