Как добраться до формы отправки комментария в youtube?

вопросы связанные с работой версии с Chromium
Ответить
Аватара пользователя
sashawww
Сообщения: 54
Зарегистрирован: 15 дек 2009, 03:26

Как добраться до формы отправки комментария в youtube?

Сообщение sashawww » 06 дек 2020, 20:37

Версия Human Emulator 7.0.55
Логинюсь в youtube, пытаюсь найти форму отправки комментария, но никак не получается. Проблема, видимо, заключается в том, что форма отправки комментария появляется не при загрузке страницы, а при прокрутке страницы вниз. Я прокручиваю страницу вниз, визуально форма подгружается, но в коде отловить её никак не получается.

Код: Выделить всё

$browser->navigate("https://www.youtube.com/watch?v=ba9UphVVoKg");
$browser->wait(1);

$mouse->send_wheel(-3,100,100)."\n";

aa:

usleep(mt_rand(1000000,2000000));

$mouse->send_wheel(mt_rand(-3,3),100,100)."\n";

if( ! $anchor->wait_element_exist_by_inner_text("ОСТАВИТЬ КОММЕНТАРИЙ", false) ){
    echo "Пока нет формы...\n";
    goto aa;
} else {
    echo "Есть форма!!!\n";
}


Аватара пользователя
Support
Site Admin
Сообщения: 1000
Зарегистрирован: 10 апр 2009, 17:45
Контактная информация:

Re: Как добраться до формы отправки комментария в youtube?

Сообщение Support » 07 дек 2020, 17:05

Можно это сделать через подобные изображения.

$browser->navigate("https://www.youtube.com/watch?v=ba9UphVVoKg");

$path_templ_imgs = "pattern.jpg";

$mouse->send_wheel(-3,100,100)."\n";
	sleep(3);

$pos = $webpage->get_pos_in_webpage_picture($path_templ_imgs ,0.9,3);
        // echo "левый верхний угол картинки $pos->x x $pos->y<br>";
        $mouse->move($pos->x+30,$pos->y+20,true);
        $mouse->send_click($pos->x+30,$pos->y+20,true);
        sleep(mt_rand(1,3));

$keyboard->send_input("Круто!!!\n");
Логика простая. Форма становится активна, когда вы на неё кликаете. Можно это сделать через подобные изображения. Кликнули ввели текст и также через подобные потом нажали на кнопку если вдруг не получается на неё нажать другими способами.

шаблонная картинка:
pattern.jpg
pattern.jpg (3.15 КБ) 1262 просмотра
Как у меня это отображается:
pattern2.jpg
pattern2.jpg (111.01 КБ) 1262 просмотра

Аватара пользователя
sashawww
Сообщения: 54
Зарегистрирован: 15 дек 2009, 03:26

Re: Как добраться до формы отправки комментария в youtube?

Сообщение sashawww » 08 дек 2020, 14:32

Попробовал предложенный вариант. Удалось кликнуть по форме, но работает через раз - то работает, запускаю скрипт повторно - уже не работает, запускаю снова - опять работает.
Такой вариант мне совсем не нравится, по сути - это костыльное решение, к томуже частично неработоспособное.
Вы можете сказать почему не работает простой вариант?

Код: Выделить всё

$browser->navigate("https://www.youtube.com/watch?v=ba9UphVVoKg");
$browser->wait(1);

$mouse->send_wheel(-3,100,100)."\n";

aa:

usleep(mt_rand(1000000,2000000));

$mouse->send_wheel(mt_rand(-3,3),100,100)."\n";

if( ! $anchor->wait_element_exist_by_inner_text("ОСТАВИТЬ КОММЕНТАРИЙ", false) ){
    echo "Пока нет формы...\n";
    goto aa;
} else {
    echo "Есть форма!!!\n";
}
Возможно потому, что контент появляется не при загрузке страницы, а подгружается в процессе прокрутки скролла? Но тогда - это существенное ограничение функционала программы, ведь многие сайты сейчас используют подгрузку контента в процессе прокрутки страницы! И плохо если до этих элементов можно добраться только через громоздкие костыли.
Возможно в программе нужен метод:

Код: Выделить всё

$browser->refresh_dom();
Который мог бы полностью обновить дом дерево, чтобы включить подгруженные элементы? Это полностью решило бы подобные проблемы. Хотелось бы услышать комментарий bigfozzy по этому поводу.

Аватара пользователя
Support
Site Admin
Сообщения: 1000
Зарегистрирован: 10 апр 2009, 17:45
Контактная информация:

Re: Как добраться до формы отправки комментария в youtube?

Сообщение Support » 08 дек 2020, 16:13

$browser->navigate("https://www.youtube.com/watch?v=ba9UphVVoKg");

$mouse->send_wheel(-3,100,100)."\n";
	sleep(3);

$add = $div->get_by_id("icon-label", true);
$add->send_mouse_move(10,50);
$add->send_mouse_click(10,50);
$keyboard->send_input("Круто!!!");

$element->click_by_inner_text("COMMENT", true);
Как вариант можно сделать так. Находим элемент SORT BY поле для ввода комментария находится под ним. Кликаем на него добавляем свой комментарий и нажимаем на кнопку "COMMENT".

Аватара пользователя
bigfozzy
Site Admin
Сообщения: 3047
Зарегистрирован: 28 июл 2008, 17:24
Контактная информация:

Re: Как добраться до формы отправки комментария в youtube?

Сообщение bigfozzy » 08 дек 2020, 20:01

Возможно в программе нужен метод:

Код: Выделить всё

$browser->refresh_dom();
Который мог бы полностью обновить дом дерево, чтобы включить подгруженные элементы? Это полностью решило бы подобные проблемы. Хотелось бы услышать комментарий bigfozzy по этому поводу.
Подскажите - это как можно сделать ? Или как вы это видите ?

Аватара пользователя
sashawww
Сообщения: 54
Зарегистрирован: 15 дек 2009, 03:26

Re: Как добраться до формы отправки комментария в youtube?

Сообщение sashawww » 17 дек 2020, 12:54

Вот мне и хотелось услышать о возможности добавления такого метода. Кстати, последний вариант, предложенный саппортом - отлично работает.

Аватара пользователя
bigfozzy
Site Admin
Сообщения: 3047
Зарегистрирован: 28 июл 2008, 17:24
Контактная информация:

Re: Как добраться до формы отправки комментария в youtube?

Сообщение bigfozzy » 18 дек 2020, 14:07

sashawww писал(а):
17 дек 2020, 12:54
Вот мне и хотелось услышать о возможности добавления такого метода. Кстати, последний вариант, предложенный саппортом - отлично работает.
Ну насколько я понимаю - это невозможно или я не понял что нужно конкретно сделать - поэтому уточняю, что вы имели ввиду под reftesh_dom.

Там механизм другой - в ответ на события от ввода пользователя - меняется DOM модель. т.е надо использовать мышь и клавиатуру чтобы произошло обновление DOM в соответствии с интерфейсом сайта. Эти функции уже есть.

Ответить