Что мешает обнаружению детей родителей моим кодом? - PullRequest
0 голосов
/ 30 декабря 2018

Написание скрипта Greasemonkey, который:

  1. Сначала собирает элементы, которые соответствуют критерию.Это <a> теги.
  2. В простом цикле for он будет выполнять автоматический клик по каждой ссылке.
  3. Затем он щелкает по другой ссылке <a>.
  4. После этого он будетвведите текст перед отправкой на сервер.
  5. Цикл for повторяет последовательность до тех пор, пока список не будет исчерпан.

Я выяснил, как создать коллекцию нужных элементов, но по какой-то причине код не может получить доступ к некоторым дочерним узлам, возвращая результаты, такие как null и undefined.

Проблема возникает в этом разделе кода:

$(".indeed-apply-button").html();

Этот класс является частью тега <a>.

Поэтому я попытался получить доступ к дочерним узламс querySelector(), который возвращает неопределенное.

Я пытался использовать селектор $();.Он вернет [object Object].При добавлении .html() он вернет undefined.

Тег <a>, который я хочу извлечь из документа, ограничен несколькими родительскими тегами <div>.
Где-то в коде внутри сериииз этих <div> тегов существует точка, в которой мой код либо отказывается, либо не может получить доступ к дочерним узлам.

Скрипт запускается на самом деле после поиска работы.Он выберет каждое задание в списке и затем нажмет кнопку «Применить».
Например, www.indeed.com / q-programmer-l-maine-jobs.html

Чтоможет привести к невозможности извлечения некоторых элементов, это будет более общий вопрос.

$(document).ready(function(){

var jobList = document.querySelectorAll("a[data-tn-element='jobTitle']");

  function clickThenApply (jobNumber) {
    var jobTitle = $(jobList[jobNumber]).attr("title"); //job name
    var jobLink = $(jobList[jobNumber]).attr("href"); //job link
    jobList[jobNumber].click();
    var apply = $(".indeed-apply-button").html();
    console.log("Job title: " + jobTitle);
    console.log("Job link: " + jobLink);
    console.log("success? " + apply);
    return true;
    }

  for (var i = 0; i < jobList.length; i++) {
  var tog = clickThenApply(i);
  }

});

Проблема возникает в этом разделе кода:

$(".indeed-apply-button").html();

Этот класс является частьютега <a>:

<a class="indeed-apply-button" href="javascript:void(0);" id="indeed-ia-...">
  <span class="indeed-apply-button-inner" id="indeed-ia-...">
    <span class="indeed-apply-button-label" id="indeed-ia-...">Apply Now</span>
    <span class="indeed-apply-button-cm">
      <img src="....cloudfront.net/indeedapply/s/14096d1/check.png">
    </span>
  </span>
</a>

Я пытался:

document.querySelector("a.indeed-apply-button");

Возвращает ноль / не определено.

Если вы могли бы предоставить какое-либо понимание этого,Буду признателен за это!

1 Ответ

0 голосов
/ 30 декабря 2018

Как сказал Брок в комментариях, проблема в том, что простое нажатие на кнопку не означает, что каждый элемент уже существует.Множество вещей может произойти асинхронно, чтобы вызвать это.

Давайте проявим изобретательность.В любом приложении, которое я видел, есть кнопка, которую вы ищете, или .view-apply-button.Мы собираемся использовать это как наш сигнал о том, что что-то произошло.

Во-первых, мы будем возвращать обещания с этого момента.Получить библиотеку, если она не встроенная.

function clickThenApply(jobNumber) {
  var jobTitle = $(jobList[jobNumber]).attr("title"); //job name
  var jobLink = $(jobList[jobNumber]).attr("href"); //job link

  return new Promise(function(resolve, reject) {
    // Do the click
    jobList[jobNumber].click();

    // Set our interval. This will test whether there is either of the buttons
    var interval = setInterval(function() {
      var applyButton = $(".indeed-apply-button");
      if (applyButton.length > 0) {
        clearInterval(interval);
        clearTimeout(timeout);
        return resolve({
          name: jobTitle,
          link: jobLink,
          apply: applyButton
        });
      var toSiteButton = $(".view-apply-button");
      if (toSiteButton.length > 0) {
        clearInterval(interval);
        clearTimeout(timeout);
        return resolve({
          name: jobTitle,
          link: jobLink,
          visit: applyButton
        });
    }, 100);
    var timeout = setTimeout(function() {
      if (interval) clearInterval(interval);
      reject({
        name: jobTitle,
        link: jobLink,
        error: "Button not found after 5000ms"
      });
    }, 5000);
  });
}

Код намеренно многословен, поэтому он читабелен и его цель ясна.Каждые 100 мс я проверяю, существует ли какая-либо из кнопок.Если они это сделают, я разрешу Promise с данными (которые вы можете затем обработать в другом месте).Если по истечении 5 секунд у меня все еще ничего нет, я возвращаю ошибку.

Однако я оставил некоторые вещи на ваше усмотрение:

  • Вам нужно будет связать эти вызовычтобы заставить его работать, так как одновременное нажатие нескольких кнопок будет адом на Земле
  • Вам также нужно будет убедиться, что кнопка не исчезает при ее использовании
...