从不可见的页面获取信息

时间:2016-12-27 00:11:15

标签: java selenium-webdriver

要求:访问Indeed.com 在什么领域使用QA工程师和在哪里使用西雅图,华盛顿州。 从亚马逊或自动化以外的所有页面打印职位描述/标题

问题:在Firepath中我使用的这个xpath // div [包含(@id,' p')] [contains(@class,' row')]选择所有 第1页的工作。但是当我执行下面的代码时,它只打印第一页的第一个作业描述 一遍又一遍地,同时继续点击其他页面。

我得到的输出:

高级质量保证工程师 - 公民...... Sound Transit - 12条评论 - 西雅图,华盛顿 $ 79,626 - 每年99,533美元 导师,教练和指导QA工程师维持既定的工作标准。通过为质量保证提供指导,支持质量保证小组内的一致性...... 保存工作 赞助

代码:

import java.util.List;
import java.util.concurrent.TimeUnit;

import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.interactions.Actions;


public class QAJob {
    int MAX_PAGES;

    @Test
    public void jobSearch(){
        WebDriver driver= new FirefoxDriver();
        driver.get("https://www.indeed.com");
        driver.findElement(By.id("what")).sendKeys("QA Engineer");
        driver.findElement(By.id("where")).clear();
        driver.findElement(By.id("where")).sendKeys("Seattle,WA");
        driver.findElement(By.id("fj")).click();
        driver.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);

        // Close the pop up window that appears
        driver.findElement(By.id("prime-popover-close-button")).click();

        //Code to scroll down
        JavascriptExecutor jse = (JavascriptExecutor) driver;
        jse.executeScript("window.scrollBy(0,1000)", "");

        //Find and print the number of pages found for search       
        List<WebElement> search_pages=driver.findElements(By.xpath("//div[contains(@class,'pagination')]//a"));
        System.out.println("Number of pages found for job search is " +search_pages.size());

        //Code to get and print job descriptions,title  
        List<WebElement> job_desc=driver.findElements(By.xpath("//div[contains(@id,'p')][contains(@class,'row')]"));

        for(WebElement e: job_desc){
            //using String so that I can use 'contains'
            String str_job_description=e.getText();

                while(search_pages.size()!=0){

                    //find Next link and click on it till the size is !=0 to get to last page
                    driver.findElement(By.xpath("//span[contains(@class,'np')][contains(text(),'Next')]")).click(); 
                    driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
                    //Do not want Amazon or Automation jobs
                    if(!((str_job_description.contains("Automation")) || (str_job_description.contains("Amazon"))) ){
                        System.out.println(str_job_description);
                    }

                }
            }
        }
    }

我可以使用一些有用的建议/想法。提前感谢您的时间。

1 个答案:

答案 0 :(得分:0)

对于job_desc(外部for循环)中的每个元素,您点击下一个按钮,直到到达最后一页(内部while循环)。 for循环应位于while内。您可以尝试这样的事情(未经测试)

while(search_pages.size() != 0) {
    List<WebElement> job_desc=driver.findElements(By.xpath("//div[contains(@id,'p')][contains(@class,'row')]"));
    for(WebElement e: job_desc){
        String str_job_description=e.getText();
        if(!((str_job_description.contains("Automation")) || (str_job_description.contains("Amazon"))) ){
            System.out.println(str_job_description);
        }
    }
    driver.findElement(By.xpath("//span[contains(@class,'np')][contains(text(),'Next')]")).click(); 
}

作为旁注,不需要在每次迭代时定义隐式等待driver.manage().timeouts().implicitlyWait,在创建driver时定义一次。如果您想等待,请使用Expected Conditions

显式等待
WebDriverWait wait = new WebDriverWait(driver, 10);
WebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(By by));