Работа с 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'] и совмещать их как-то... Вообщем нифига не работает, может кто даст совет, что с этим делать?
 
может клик по картинке использовать
 
попробуйте через JS кубик
 
попробуйте через 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));
})();
 
у вас в выражении есть "След". если язык интерфейса не русский, то вместо "След" будет другое слово. скорее всего в этом проблема.
так же может быть проблема в отличии настроек на аккаунтах. некоторые настройки тоже могут менять код кнопок.

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

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

нет, проблема не в этом, проблема в эмуляции через C#, она просто не работает в гугле через раз.
 
нет, проблема не в этом, проблема в эмуляции через C#, она просто не работает в гугле через раз

у меня в боте все эмуляции четко работают)


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

 
у меня в боте все эмуляции четко работают)


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


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

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