Как сделать клик в xPath только по видимой кнопке?

luk911

Client
Регистрация
17.01.2013
Сообщения
1 542
Благодарностей
579
Баллы
113
C#:
    //Находим все элементы, содержащие ссылки
        var colLinks = tab.FindElementsByXPath(xpath);
        //Вычленяем только видимые на странице ссылки
        var colResult = tab.FindElementsByXPath("//sngvuyrbuy");
        if (colLinks.Count>0)
        {
            foreach (var he in colLinks.Elements)
            {
                int topInBrowser = int.Parse(he.GetAttribute("topInBrowser"));
                int leftInBrowser = int.Parse(he.GetAttribute("leftInBrowser"));
                if (he.Height>=0 && he.Width>=0 && topInBrowser>=0 && leftInBrowser>=0)
                {
                    //сюда проверка
                }
 
  • Спасибо
Реакции: orka13

Nekro

Client
Регистрация
01.08.2020
Сообщения
232
Благодарностей
24
Баллы
18
короче, конченный фб, у меня такого нет нифига, ну да ладно. у тебя походу элементы дизайна старого еще

в общем есть простое решение: xpath видит ВСЕ элементы, надо прописать нужное так, чтоб совпадений не было
идешь в свой редактор xpath и поочередно подставляешь в путь номер совпадения, это будет так

C#:
(//button[text()='Опубликовать'])[1]
цифру 1 поочередно менять на 2,3,4 пока не найдешь нужное совпадение
Так у меня тогда получится 1, 2, 3, 4 и тд. ненужных мне репоста, пока я дойду до нужного поста. Или я что-то неправильно понял опять?


C#:
    //Находим все элементы, содержащие ссылки
        var colLinks = tab.FindElementsByXPath(xpath);
        //Вычленяем только видимые на странице ссылки
        var colResult = tab.FindElementsByXPath("//sngvuyrbuy");
        if (colLinks.Count>0)
        {
            foreach (var he in colLinks.Elements)
            {
                int topInBrowser = int.Parse(he.GetAttribute("topInBrowser"));
                int leftInBrowser = int.Parse(he.GetAttribute("leftInBrowser"));
                if (he.Height>=0 && he.Width>=0 && topInBrowser>=0 && leftInBrowser>=0)
                {
                    //сюда проверка
                }
Спасибо. Попробую разобраться...
 

luk911

Client
Регистрация
17.01.2013
Сообщения
1 542
Благодарностей
579
Баллы
113
короче, конченный фб, у меня такого нет нифига, ну да ладно. у тебя походу элементы дизайна старого еще

в общем есть простое решение: xpath видит ВСЕ элементы, надо прописать нужное так, чтоб совпадений не было
идешь в свой редактор xpath и поочередно подставляешь в путь номер совпадения, это будет так

C#:
(//button[text()='Опубликовать'])[1]
цифру 1 поочередно менять на 2,3,4 пока не найдешь нужное совпадение
а зачем менять то ? если ты ищешь по xpath и по относительному параметру ... Я пока не вижу ситуации когда там две кнопки вообще есть.
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
C#:
    //Находим все элементы, содержащие ссылки
        var colLinks = tab.FindElementsByXPath(xpath);
        //Вычленяем только видимые на странице ссылки
        var colResult = tab.FindElementsByXPath("//sngvuyrbuy");
        if (colLinks.Count>0)
        {
            foreach (var he in colLinks.Elements)
            {
                int topInBrowser = int.Parse(he.GetAttribute("topInBrowser"));
                int leftInBrowser = int.Parse(he.GetAttribute("leftInBrowser"));
                if (he.Height>=0 && he.Width>=0 && topInBrowser>=0 && leftInBrowser>=0)
                {
                    //сюда проверка
                }
судя по этому коду элемент с шириной 0 и высотой 0 считается видимым. ну так себе видимость я бы сказал :-)
 
  • Спасибо
Реакции: orka13

backoff

Client
Регистрация
20.04.2015
Сообщения
6 052
Благодарностей
6 482
Баллы
113
Или я что-то неправильно понял опять?
верно, не правильно понял.
заходишь под хромом обычным и ищешь xpath, проверяешь нужную комбинацию из цифр, если выделилась нужная тебе кнопка, значит это и есть нужная комбинация

вот пример
выделены ВСЕ элементы - http://joxi.ru/12Mj9BwFlW1zXA
нужный по номеру - http://joxi.ru/RmzkGe7uY3we72
 

luk911

Client
Регистрация
17.01.2013
Сообщения
1 542
Благодарностей
579
Баллы
113

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
а ты свой запости, этот код более менее работает.
ну просто у каждого свой размер элемента, с которого начинается видимость :-)
например я ставлю видимость от 3-х пикселей.
 

luk911

Client
Регистрация
17.01.2013
Сообщения
1 542
Благодарностей
579
Баллы
113
ну просто у каждого свой размер элемента, с которого начинается видимость :-)
например я ставлю видимость от 3-х пикселей.
ну это детали, верстальщики те еще чудаки, они могут и спан сделать в 0, но внутри там много еще чего ...
 

Nekro

Client
Регистрация
01.08.2020
Сообщения
232
Благодарностей
24
Баллы
18
верно, не правильно понял.
заходишь под хромом обычным и ищешь xpath, проверяешь нужную комбинацию из цифр, если выделилась нужная тебе кнопка, значит это и есть нужная комбинация

вот пример
выделены ВСЕ элементы - http://joxi.ru/12Mj9BwFlW1zXA
нужный по номеру - http://joxi.ru/RmzkGe7uY3we72
Смотри. Я открываю окно репоста. Первый пост репостнуть никаких проблем. Всё нормально. Потом идёт второй, третий, четвёртый и тд. Мне нужно репостить не всё подряд. Может быть так что репост потребуется через 1 пост. Моя проблема в том, что я не могу привязать это окно с репостом к определённому посту, который я репощу. Выборка по номеру тут тоже не сработает, потому что как я тогда узнаю тот ли это пост или нет? Я могу это только руками правильно сделать. Бот же будет жать кнопку, которую я ему укажу. А я не могу каждый раз указывать правильный номер, потому что не знаю какой конкретно номер будет соответствовать моему посту без какой-либо привязки. А там все классы и ID динамические и зацепить нечего.

62419
 

backoff

Client
Регистрация
20.04.2015
Сообщения
6 052
Благодарностей
6 482
Баллы
113
ну тогда вариант остается только один и самый логичный, который я сразу и описал.
надо составить правильный путь к кнопке.
даже при том что кнопок много, у всплывающего окна есть свой класс/див который и отвечает за всплытие, вот к нему надо и привязаться

ps \ если бы я понимал как воспроизвести действия, то составил...
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
составить то можно...., но вот как туда попасть фиг знает :-)
аккаунт забанен, хотя я им и не пользовался :-)
 

luk911

Client
Регистрация
17.01.2013
Сообщения
1 542
Благодарностей
579
Баллы
113
Смотри. Я открываю окно репоста. Первый пост репостнуть никаких проблем. Всё нормально. Потом идёт второй, третий, четвёртый и тд. Мне нужно репостить не всё подряд. Может быть так что репост потребуется через 1 пост. Моя проблема в том, что я не могу привязать это окно с репостом к определённому посту, который я репощу. Выборка по номеру тут тоже не сработает, потому что как я тогда узнаю тот ли это пост или нет? Я могу это только руками правильно сделать. Бот же будет жать кнопку, которую я ему укажу. А я не могу каждый раз указывать правильный номер, потому что не знаю какой конкретно номер будет соответствовать моему посту без какой-либо привязки. А там все классы и ID динамические и зацепить нечего.

Посмотреть вложение 62419
я тебе уже сказал - не надо использовать творение пьяного индуса. Ты попробуй другое расширение.
 

Gunjubasik

Client
Регистрация
30.05.2019
Сообщения
3 526
Благодарностей
1 323
Баллы
113
Здравствуйте.

Работаю с Facebook и там при репосте записи есть кнопка опубликовать, во всплывающем окне. Как сделать чтобы xPath кликал только по видимому элементу, а не в порядке очереди DOM? (если это вообще возможно)

Код:
//button[text()="Опубликовать"]
Вопрос общий. С Facebook много похожих ситуаций где зацепиться не за что. Все классы и ID динамические + совершенно другие ветки.
Если у вас все еще осталась проблема, могу зайти по удаленному доступу и попытаться объяснить и помочь, если выйдет. Напишите мне в телеграм, если нужна помощь.
 
Последнее редактирование:

Nekro

Client
Регистрация
01.08.2020
Сообщения
232
Благодарностей
24
Баллы
18
ну тогда вариант остается только один и самый логичный, который я сразу и описал.
надо составить правильный путь к кнопке.
даже при том что кнопок много, у всплывающего окна есть свой класс/див который и отвечает за всплытие, вот к нему надо и привязаться

ps \ если бы я понимал как воспроизвести действия, то составил...
Не к чему зацепиться. Так бы я давно уже составил xpath. Динамические id/class у всей ветки. Facebook же.

я тебе уже сказал - не надо использовать творение пьяного индуса. Ты попробуй другое расширение.
Не успел ещё поменять творение индуса :D Там я показываю, что элемента 4. У индуса и в обычной консоли Chrome результат одинаковый.


Если у вас все еще осталась проблема, могу зайти по удаленному доступу и попытаться объяснить и помочь, если выйдет. Напишите мне в телеграм, если нужна помощь.
Спасибо за предложенную помощь. Я думаю не стоит так себя утруждать. Действие простое, но как я понял легко выполнить задачу не получится. Мне кажется это окно на js вырисовывается. Находится внизу страницы со скриптами в DOM.

Я ещё попробую решение выше, которое мне предложили на C#. Не знаю получится ли.
 
Последнее редактирование:

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113

Nekro

Client
Регистрация
01.08.2020
Сообщения
232
Благодарностей
24
Баллы
18
Короче вроде получилось. Я обнаружил единственное отличие в этом окне, от других. Стиль opacity не 0, а 1. За это зацепился + min width: без конкретного значения, потому что размер окна может быть разный, а данный параметр там динамический. В итоге код:

Код:
//div[starts-with(@style,'opacity: 1; min-width:')]//div//button[text()="Опубликовать"]
Всем спасибо кто пытался помочь! Не ожидал столько обратной связи. Я уж думал мне придётся парсить DOM, подставлять туда какой-нибудь якорь или через всю страницу связь каким-то образом делать.
 

backoff

Client
Регистрация
20.04.2015
Сообщения
6 052
Благодарностей
6 482
Баллы
113
Не ожидал столько обратной связи
если еще сразу все четко бы обрисовали)

Я уж думал мне придётся парсить DOM, подставлять туда какой-нибудь якорь или через всю страницу связь каким-то образом делать.
а чего такого, тоже рабочий вариант кстати )
 

one

Client
Регистрация
22.09.2015
Сообщения
6 833
Благодарностей
1 275
Баллы
113
ТС пользуется новым интерфейсом ФБ.
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)