Як я викрадав автомобілі
Інтро
Моя історія така ж, як і у інших сотень айтішників в Україні. Навчався я в математичному класі, мою школу на протязі багатьох років оточують недобудови, які в свій час були кублами. Далі був фіз-мат КПІ, на якому мене навчили усередині загрібати знання. Ну і класичний пошук себе, починаючи з середини університетського життя ...
Пробував я працювати в банках, в магазинах електроніки і побутової техніки, взуттєвих магазинах, страхуванні і ще багатьох місцях. На щастя, мій стаж у всіх цих галузях обмежувався одним днем. Були в цій нестабільній низці досвіду, і професії наближені до IT - php'шние конторки, в яких я остаточно зрозумів, який роботи я не хочу.
Незмінним було те, що я постійно вчив щось технічне. Спершу HTML, потім CSS, далі РНР, JS, а потім узявся за голову і зі злості вивчив Java SE. Остання технологія привела мене до лав автоматизаторів web-додатків і понеслося ...
Я показував відмінний результат, освоював нові вершини, переймав у своїх досвідчених співробітників професійні навички, піднімався вгору по кар'єрних сходах. І раптом зрозумів, що мої фінансові можливості не збігаються з бажаннями, адже я все так само як і той маленький хлопчик з математичного класу, продовжував жити в районі, де труби заводів замінюють пам'ятки, а все навколишнє нагадує гетто після бомбардування.
І тут підвернулася справа. Мені знадобилися автомобілі, багато автомобілів! Автомобілі всіх популярних марок, а також всі їх моделі ... І все це треба було оформити в структурованому вигляді.
Технічна частина питання
Спершу, пройшовся по пошуку і не знайшов даних в зручному для мене вигляді. Відразу після цього почав переглядати англомовні автомобільні сайти. Зупинився на cars.com , там є відмінний блок, в якому можна шукати нові машини. Проклацал я цей функціонал і переконався, що список машин мене задовольняє. Ну а далі справа техніки ...
Відкриваю екліпс, створюю новий проект з такими залежностями в pom.xml:
org.seleniumhq.selenium selenium-server 2.25.0 javax.xml jaxp-api 1.4.2 org.testng testng 6.1.1 test
Selenium-server потрібен для можливості взаємодіяти з web-інтерфейсом через браузер, jaxp-api необхідний для формування xml-документа, testng відповідає за запуск класу, який буде «викрадати» машини.
Далі по діагоналі освіжив jax-документацію в своїй пам'яті і написав немудрий клас, який призначений для занесення в кінцевий документ марок машин та їх моделей.
public class Hijacker {
private DocumentBuilderFactory docFactory = null;
private DocumentBuilder docBuilder = null;
private Document document = null;
private Element rootEl = null;
private TransformerFactory transformerFactory = null;
private Transformer transformer = null;
private DOMSource source = null;
public Hijacker () {
docFactory = DocumentBuilderFactory.newInstance ();
try {
docBuilder = docFactory.newDocumentBuilder ();
} Catch (ParserConfigurationException e) {
e.printStackTrace ();
}
document = docBuilder.newDocument ();
rootEl = document.createElement ("cars");
document.appendChild (rootEl);
transformerFactory = TransformerFactory.newInstance ();
try {
transformer = transformerFactory.newTransformer ();
} Catch (TransformerConfigurationException e) {
e.printStackTrace ();
}
}
public void addEntity (String makeVal, String modelVal) {
if (modelVal.equals ("All Models") | | makeVal.equals ("All Makes")) {
return;
} Else {
Element brandEl = document.createElement ("brand");
Attr make = document.createAttribute ("make");
make.setValue (makeVal);
brandEl.setAttributeNode (make);
rootEl.appendChild (brandEl);
Element model = document.createElement ("model");
model.setTextContent (modelVal);
brandEl.appendChild (model);
}
}
public void createReport () throws TransformerException {
source = new DOMSource (document);
StreamResult result = new StreamResult (new File ("E: CarEntities.xml"));
transformer.transform (source, result);
}
}
Конструктор і два методи повністю вирішують питання роботи з xml-документом. Останній етап вимагає заходу на сайт з машинами і прохід за списками марок і моделей автомобілів. Для цього я використовував раніше згаданий selenium і testNG.
public class Parser {
Hijacker extractor = new Hijacker ();
@ Test
public void parseCars ()
throws InterruptedException, TransformerException {
WebDriver driver = new FirefoxDriver ();
driver.get ("");
WebElement makeEl = driver.findElement (By.id ("newMake"));
Select makeDropDown = new Select (makeEl);
List makeList = makeDropDown.getOptions ();
for (WebElement make: makeList) {
Thread.sleep (2000);
WebElement modelEl = driver.findElement (By.id ("newModel"));
Select modelDropDown = new Select (modelEl);
makeDropDown.selectByVisibleText (make.getText ());
List modelList = modelDropDown.getOptions ();
for (WebElement carModel: modelList) {
extractor.addEntity (make.getText (), carModel.getText ());
}
}
extractor.createReport ();
driver.close ();
}
}
У цьому класі, мабуть, слід звернути увагу тільки на рядок із призупиненням потоку. У зв'язку з тим, що в залежності від того, яку марку автомобіля ми вибираємо, підвантажується список її всіх можливих моделей, що іноді може відбуватися повільніше, ніж відпрацьовує WebDriver.
В результаті отримуємо документ з чіткою структурою виду:
TSX ZDX DB9
Опубліковано: 17/12/12 @ 09:34
Розділ Різне
Рекомендуємо:
Успішні кейси просування в Яндексі . Частина 8 . Мільйон сторінок під НЧ .
25 грудня, Львів - Testers ' Talk # 09 : Post - apocalyptic testing
AMA : Розробка в Таїланді
Хто виживе після " Калінінграда " ? Наслідки персоналізації для основних гравців ринку .
Організаторський звіт про зустріч Front - end Meet Up @ Lohika