Работа с Gmail

KrashBandicoot

Пользователь
Регистрация
13.04.2014
Сообщения
243
Благодарностей
9
Баллы
18
Столкнулся с кучей проблем, пытаясь настроить клики внутри Gmail, работает через раз, иногда вообще не работает, например вот эта кнопка перелистывания страниц писем
HTML:
<div id=":m3" class="T-I J-J5-Ji amD T-I-awG T-I-ax7 T-I-Js-Gs L3" role="button" tabindex="0" jslog="126439; u014N:cOuCgd,Kr2w4b" data-tooltip="След." aria-label="След." style="user-select: none;"><span class="amF" aria-hidden="true">&nbsp;</span><img class="amJ T-I-J3" src="images/cleardot.gif" alt=""></div>
я пытался и обычный кубик клика из конструктора действий использовать и через csharp эмуляцию полную делать
C#:
instance.UseFullMouseEmulation = true;
instance.ActiveTab.WaitDownloading();

var buttonElement = instance.ActiveTab.FindElementByXPath("//img[@src='images/cleardot.gif']", 0);

if (!buttonElement.IsVoid) {
    buttonElement.Focus();
    System.Threading.Thread.Sleep(1000);
    buttonElement.Click();
    System.Threading.Thread.Sleep(2000);
} else {
    throw new Exception("Кнопка не найдена");
}

instance.UseFullMouseEmulation = false;
Кликать пробовал и по //div[@aria-label='След.'] и по //img[@src='images/cleardot.gif'] и совмещать их как-то... Вообщем нифига не работает, может кто даст совет, что с этим делать?
 

j2082192

Client
Регистрация
10.01.2016
Сообщения
107
Благодарностей
30
Баллы
28
может клик по картинке использовать
 

finista

Client
Регистрация
10.10.2012
Сообщения
375
Благодарностей
61
Баллы
28
попробуйте через JS кубик
 

KrashBandicoot

Пользователь
Регистрация
13.04.2014
Сообщения
243
Благодарностей
9
Баллы
18
попробуйте через JS кубик
Буквально за пару часов до вашего сообщения решил попробовать через JS и ВУАЛЯ, это работает! Если у кого моя проблема возникнет, вот код, который я использовал для JS

C#:
// Gmail: клик по кнопке «След.»
(function () {
  function collectDocs(win) {
    var out = [];
    try { out.push(win.document); } catch (e) {}
    var frs;
    try { frs = win.frames; } catch (e) { frs = null; }
    if (!frs) return out;
    for (var i = 0; i < frs.length; i++) {
      try { out = out.concat(collectDocs(frs[i])); } catch (e) {}
    }
    return out;
  }

  // Ищем активные варианты «След.»/«Next»
  var selectors = [
    "div[role='button'][aria-label='След.']:not([aria-disabled='true'])",
    "div[role='button'][data-tooltip='След.']:not([aria-disabled='true'])",
    "div[role='button'][aria-label*='След']:not([aria-disabled='true'])",
    "div[role='button'][data-tooltip*='След']:not([aria-disabled='true'])",
    "div[role='button'][aria-label*='Next']:not([aria-disabled='true'])",
    "div[role='button'][data-tooltip*='Next']:not([aria-disabled='true'])"
  ];

  function isVisible(el) {
    var s = el.ownerDocument.defaultView.getComputedStyle(el);
    if (s.display === "none" || s.visibility === "hidden") return false;
    if (!el.offsetParent && s.position !== "fixed") return false;
    return true;
  }

  var docs = collectDocs(window);
  var btn = null, doc = null;

  outer: for (var d = 0; d < docs.length; d++) {
    var documentX = docs[d];
    for (var si = 0; si < selectors.length; si++) {
      var list = [];
      try { list = documentX.querySelectorAll(selectors[si]); } catch (e) { list = []; }
      if (!list || !list.length) continue;
      // берём последнюю видимую (внизу тоже есть дубликат пагинации)
      for (var i = list.length - 1; i >= 0; i--) {
        if (isVisible(list[i])) {
          btn = list[i]; doc = documentX; break;
        }
      }
      if (btn) break outer;
    }
  }

  if (!btn) throw new Error("Кнопка «След.» не найдена или отключена");

  try { doc.defaultView.focus(); } catch (e) {}
  try { btn.focus({ preventScroll: true }); } catch (e) { try { btn.focus(); } catch (e2) {} }
  try { btn.scrollIntoView({ block: "center", inline: "center" }); } catch (e) {}

  // 1) Нативный клик
  try { btn.click(); } catch (e) {}

  // 2) Фолбэк — синтетические события
  var r = btn.getBoundingClientRect();
  var x = r.left + r.width / 2;
  var y = r.top + r.height / 2;
  var opts = { view: doc.defaultView, bubbles: true, cancelable: true, clientX: x, clientY: y, button: 0, buttons: 1 };

  try { btn.dispatchEvent(new PointerEvent("pointerdown", opts)); } catch (e) {}
  btn.dispatchEvent(new MouseEvent("mousedown", opts));
  try { btn.dispatchEvent(new PointerEvent("pointerup", opts)); } catch (e) {}
  btn.dispatchEvent(new MouseEvent("mouseup", opts));
  btn.dispatchEvent(new MouseEvent("click", opts));
})();
 

lidoff

Client
Регистрация
15.04.2024
Сообщения
104
Благодарностей
10
Баллы
18
у вас в выражении есть "След". если язык интерфейса не русский, то вместо "След" будет другое слово. скорее всего в этом проблема.
так же может быть проблема в отличии настроек на аккаунтах. некоторые настройки тоже могут менять код кнопок.

после авторизации надо приводить все аккаунты к одному виду: язык, настройки. тогда бот будет работать без ошибок.
 

KrashBandicoot

Пользователь
Регистрация
13.04.2014
Сообщения
243
Благодарностей
9
Баллы
18
у вас в выражении есть "След". если язык интерфейса не русский, то вместо "След" будет другое слово. скорее всего в этом проблема.
так же может быть проблема в отличии настроек на аккаунтах. некоторые настройки тоже могут менять код кнопок.

после авторизации надо приводить все аккаунты к одному виду: язык, настройки. тогда бот будет работать без ошибок.
нет, проблема не в этом, проблема в эмуляции через C#, она просто не работает в гугле через раз.
 

lidoff

Client
Регистрация
15.04.2024
Сообщения
104
Благодарностей
10
Баллы
18
нет, проблема не в этом, проблема в эмуляции через C#, она просто не работает в гугле через раз
у меня в боте все эмуляции четко работают)


кпопка перелистывания страниц в боте не используется, потому предположил варианты проблемы. сам с подобным сталкивался.
кстати, есть бот для авторизации в аккаунте gmail на основе бота для рассылки. пишите в личку, если нужен.

 

KrashBandicoot

Пользователь
Регистрация
13.04.2014
Сообщения
243
Благодарностей
9
Баллы
18
у меня в боте все эмуляции четко работают)


кпопка перелистывания страниц в боте не используется, потому предположил варианты проблемы. сам с подобным сталкивался.
кстати, есть бот для авторизации в аккаунте gmail на основе бота для рассылки. пишите в личку, если нужен.

Некоторые кнопки в gmail, да и сама страница писем динамически генерируются и по xpath к ним нельзя обратиться через С# или стандартный кубик, он просто не находит их, бывает из разряда он не жмёт, ты вручную по странице походишь и кубик начинает работать... Тот JS код, что я скинул работает прям всегда.
 

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