В моей предыдущей статье я описал, как использовать JavaScript в консоли браузера, чтобы выполнять утомительные задачи в Интернете намного быстрее. Конечно, этот подход ограничен. Способ пойти намного дальше и дальше - использовать фреймворк автоматизации, такой как Selenium. В этой статье я покажу, насколько гибко и быстро вы можете запрограммировать сценарий, который поможет вам сэкономить много времени.

➡️ Github Repo доступен здесь ⬅️

📄 Содержание

«Первое правило любой технологии, используемой в бизнесе, заключается в том, что автоматизация, применяемая к эффективной работе, увеличит эффективность. Во-вторых, автоматизация, применяемая к неэффективным операциям, увеличивает неэффективность ».

- Билл Гейтс

Проблема

На странице Meetup.com я должен отмечать каждый флажок, чтобы получать уведомления по электронной почте для каждой группы.

Я не трачу время на просмотр всех моих групп. Meetup.com предлагает возможность отключить все уведомления, но я хочу получать обновления от некоторых выбранных групп. Другое дело, что у них есть «Напоминания», которые требуют еще большего нажатия на выпадающее меню. Это раскрывающееся меню не может обрабатываться даже кодом консоли, который я показал в предыдущей статье.

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

Как автоматизировать с помощью Selenium webdriver

Selenium позволяет использовать веб-драйвер для работы в браузере и выполнять действия, которые может делать и человек (например, нажимать на элементы).

Процесс автоматизации прост:

  • найти элемент с инспектором в вашем браузере

  • получить элемент с driver.findElement
  • выполнять действия с этим элементом с помощью .then (обещания в JS) или функций из фреймворка, например .click()
  • после выполнения задач обязательно driver.quit(); завершить работу драйвера

Использование его при установке флажков СПАМ на meetup.com

Настраивать

В этом примере я использую Selenium webdriver.

Настроить в Node.js довольно просто:

var webdriver = require('selenium-webdriver'),
	By = webdriver.By,
	until = webdriver.until;
var driver = new webdriver.Builder().forBrowser('chrome').build();
driver.manage().window().maximize();

Заходим в настройки

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

driver.get('https://secure.meetup.com/login/');
var mail = driver.findElement(webdriver.By.id('email'));
var pass = driver.findElement(webdriver.By.id('password'));
mail.sendKeys(cred.cred.user);
pass.sendKeys(cred.cred.pass);
driver.findElement(webdriver.By.name('submitButton')).click();
driver
	.findElement(
		webdriver.By.className(
			'valign--middle display--none atMedium_display--inline'
		)
	)
	.click();
driver.findElement(webdriver.By.xpath('//a[text()="Settings"]')).click();
driver.findElement(webdriver.By.xpath('//a[text()="Email Updates"]')).click();

Определите элементы и перебирайте их

Я определяю все флажки и раскрывающиеся списки и вызываю функцию (clickingAll) для каждого элемента.

const list = driver.findElements(
	webdriver.By.xpath('//li[@class="list-item"]/a')
);
list.then(function(elements) {
	var links = elements.map(elem => {
		return elem.getAttribute('href');
	});
	promise.all(links).then(linkRefs => {
		linkRefs.forEach(element => {
			driver.navigate().to(element);
			clickingAll();
		});
	});
});

Функция clickingAll() на самом деле щелкает элементы и проверяет, не установлены ли флажки (поскольку мы не хотим просто щелкать все элементы, а скорее снимать флажки со всех флажков).

var clickingAll = () => {
	driver
		.findElements(
			webdriver.By.xpath('//i[@class="icon-s icon-checkbox pseudocheckbox "]')
		)
		.then(elements => {
			elements.map(elem => {
				elem.getAttribute('aria-checked').then(check => {
					if (check === 'true') {
						elem.click();
					}
				});
			});
		});
	driver
		.findElement(webdriver.By.xpath('//select[@class="j-selectbox"]'))
		.click();
	driver
		.findElement(webdriver.By.xpath('//option[@value="NO_RECEIVE"]'))
		.click();
	try {
		driver
			.findElement(webdriver.By.xpath('//option[@value="OFF]'))
			.then(null, err => {
				if (err) {
					return false;
				}
			})
			.click();
	} catch (e) {
		return false;
	}
	driver.navigate().back();
};

Смотрите результат на Youtube

Если вы что-то узнали из этой статьи, дайте мне знать в комментариях или сердцах. Не забудьте подписаться на больше :)