Як я викрадав автомобілі

Інтро

Моя історія така ж, як і у інших сотень айтішників в Україні. Навчався я в математичному класі, мою школу на протязі багатьох років оточують недобудови, які в свій час були кублами. Далі був фіз-мат КПІ, на якому мене навчили усередині загрібати знання. Ну і класичний пошук себе, починаючи з середини університетського життя ...

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