Як я викрадав автомобілі
Інтро
Моя історія така ж, як і у інших сотень айтішників в Україні. Навчався я в математичному класі, мою школу на протязі багатьох років оточують недобудови, які в свій час були кублами. Далі був фіз-мат КПІ, на якому мене навчили усередині загрібати знання. Ну і класичний пошук себе, починаючи з середини університетського життя ...
Пробував я працювати в банках, в магазинах електроніки і побутової техніки, взуттєвих магазинах, страхуванні і ще багатьох місцях. На щастя, мій стаж у всіх цих галузях обмежувався одним днем. Були в цій нестабільній низці досвіду, і професії наближені до 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