собирать данные для HashMap selenium java - что может быть xpath? - PullRequest
0 голосов
/ 05 мая 2020

На сайте так выглядит Название города- Количество вакансий enter image description here

Сайт: https://amfam.wd1.myworkdayjobs.com/HomesiteCareers/4/refreshFacet/318c8bb6f553100021d223d9780d30be

Подумывал поставить название и соответствующий номер вакансии в HashMap, однако следующий подход, который получает название города, а затем номера вакансий на первом месте, не будет работать.

 @Test
    public void visitSite() throws InterruptedException {
        Thread.sleep(5000);
        //ToDo: Verify Locations Heading is displayed- should be Locations
        WebElement loc = driver.findElement(By.xpath("//h2//span[@title='Locations']"));
        String locTitle = loc.getText();
        String expectedTitle = "Locations";
        Assert.assertEquals(locTitle, expectedTitle);

        //ToDo: Expand the More+ section of Locations title
        WebElement expandMore = driver.findElement(By.xpath("//div[@data-metadata-id='locations']//div[@data-automation-id='wd-MoreLink']"));
        expandMore.click();
        Thread.sleep(4000);

        //ToDo: Collect City name and Number of jobs in HashMap
        HashMap<String, String> regionJobsMap = new HashMap<String, String>();

        //This code below will collect City Names in an ArrayList
        ArrayList<String> cities = new ArrayList<String>();
        List<WebElement> citiesL = driver.findElements(By.xpath("//div[@data-metadata-id='locations']//div//label"));
        for (WebElement ele : citiesL) {
            cities.add(ele.getText());
        }

        //This code below will get City amd Job numbers and add to HashMap
        ArrayList<String> jobNumbers = new ArrayList<String>();
        List<WebElement> jobsL = driver.findElements(By.xpath("//div[@data-metadata-id='locations']//span"));
        for (WebElement ele : jobsL) {
            jobNumbers.add(ele.getText().replaceAll("[^0-9]", ""));
        }
        for (int i = 0, j = 0; i < cities.size() && j < jobNumbers.size(); i++, j++) {
            regionJobsMap.put(cities.get(i), jobNumbers.get(j));
        }

        for(Map.Entry<String,String> mm:regionJobsMap.entrySet()){
            System.out.println(mm.getKey() +"  " + mm.getValue());
        }
    }

OUTPUT:
NJ - New Jersey  5
PA - Pennsylvania

Вопрос: Как лучше всего получить название города и соответствующий номер работы? Я не могу придумать 1 xpath, который даст мне оба. Если я использую отдельные xpath, фактические номера городов и вакансий не будут совпадать. Заранее благодарим за уделенное время.

1 Ответ

0 голосов
/ 05 мая 2020

Используйте приведенный ниже код для сохранения значений в хэш-карте после того, как вы нажмете ссылку «Подробнее»:

    HashMap<String,String> hm= new HashMap<String,String>();
    List<WebElement> locations = driver.findElements(By.xpath("//div[@data-metadata-id='locations']//div[@data-automation-id='facetValue']"));  //get list of locations
    for(int i=0; i<locations.size();i++) //iterate over list
    {
        String cities = locations.get(i).findElement(By.cssSelector("label[id*=CheckBox-locations]")).getText(); //get location name
        String jobNumber = locations.get(i).findElement(By.cssSelector("span[id*=CountLabel-locations]")).getText().replaceAll("[^0-9]", ""); // get no. of jobs in that particular location
        hm.put(cities, jobNumber);  // put it as key-value pair in hashmap

    }
    Set s=hm.entrySet();
    Iterator is=s.iterator();
    while(is.hasNext())
    {
        Map.Entry m= (Map.Entry)is.next();
        System.out.println(m.getKey()+"  =>  "+m.getValue()); //get values
    }

Примечание. Hashmap не поддерживает какой-либо порядок. Если это так, вы можете использовать LinkedHashMap или использовать компаратор для сортировки TreeMap.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...