无法在WebDriver中的帧之间切换

时间:2014-12-31 05:40:36

标签: java selenium-webdriver

我正在www.salesforce.com开发者登录帐户中处理联系人创建页面。任何人都可以创建一个免费的开发人员登录帐户并访问此页面。

我无法在查找窗口中切换帧。有两个框架,一个是带有文本框和搜索按钮的搜索框架,下面是用于显示搜索结果的结果框架,其中包含用于选择的超链接。我按框架名称或ID指定框架,但webDriver切换到搜索框架并进行搜索,但后来无法使用NoSuchFrameException找到结果框架。

如果我最初没有切换到搜索框架但直接切换到结果框架,那么在查找结果框架时确实是成功的,该结果框架显示默认情况下完成的一些最近搜索的结果。

如何从搜索框切换到结果框?以下是我的代码

 public class Acc_Parent 
 {
  WebDriver driver;
  FileInputStream fis;
  XSSFWorkbook wb;
  XSSFSheet sh;

  @Test
  public void createParent() throws IOException, InterruptedException, FileNotFoundException 
  {
   driver = new FirefoxDriver();
   //System.setProperty("webdriver.chrome.driver", "D:/chromedriver_win32/chromedriver.exe");
   //driver = new ChromeDriver();
  driver.manage().window().maximize();
  driver.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);

  driver.get("https://test.salesforce.com");
  fis = new FileInputStream("C:/Users/psit/Documents/Login.xlsx");
  wb = new XSSFWorkbook(fis);
  sh = wb.getSheetAt(0);
  driver.findElement(By.xpath(".//*[@id='username']")).sendKeys(sh.getRow(1).getCell(0).getStringCellValue());
  driver.findElement(By.xpath(".//*[@id='password']")).sendKeys(sh.getRow(1).getCell(1).getStringCellValue());
  driver.findElement(By.xpath(".//*[@id='Login']")).click();

  fis = new FileInputStream("C:/Users/psit/Documents/Input.xlsx");
  wb = new XSSFWorkbook(fis);
  sh = wb.getSheet("Parent");

  driver.findElement(By.xpath(".//*[@id='Account_Tab']/a")).click();
  driver.findElement(By.xpath(".//*[@id='hotlist']/table/tbody/tr/td[2]/input")).click();
  driver.findElement(By.xpath(".//*[@id='j_id0:acctFrm:nmsrch']")).sendKeys(sh.getRow(1).getCell(1).getStringCellValue());
  driver.findElement(By.xpath(".//*[@id='j_id0:acctFrm']/div[1]/div[2]/table/tbody/tr/td[2]/input")).click();
  try
  {
      driver.findElement(By.linkText("click here")).click();

      driver.findElement(By.xpath(".//*[@id='parentAcc']")).sendKeys(sh.getRow(1).getCell(1).getStringCellValue());
      Thread.sleep(2000);
      driver.findElement(By.xpath(".//*[@id='childAcc']")).sendKeys(sh.getRow(1).getCell(2).getStringCellValue());
      Thread.sleep(2000);

      driver.findElement(By.xpath(".//*[@id='pg:acc:pb:acctAdd:rptAddFields:0:actFields']")).sendKeys(sh.getRow(1).getCell(3).getStringCellValue());
      Thread.sleep(2000);
      driver.findElement(By.xpath(".//*[@id='pg:acc:pb:acctAdd:rptAddFields:2:actFields']")).sendKeys(sh.getRow(1).getCell(4).getStringCellValue());
      Thread.sleep(2000);
      driver.findElement(By.xpath(".//*[@id='pg:acc:pb:acctAdd:rptAddFields:4:actFields']")).sendKeys(sh.getRow(1).getCell(5).getStringCellValue());
      Thread.sleep(2000);
      driver.findElement(By.xpath(".//*[@id='pg:acc:pb:acctAdd:rptAddFields:6:actFields']")).sendKeys(sh.getRow(1).getCell(6).getStringCellValue());
      Thread.sleep(2000);
      driver.findElement(By.xpath(".//*[@id='pg:acc:pb:acctAdd:rptAddFields:8:actFields']")).sendKeys(Integer.toString((int)sh.getRow(1).getCell(7).getNumericCellValue()));
      Thread.sleep(2000);
      driver.findElement(By.xpath(".//*[@id='pg:acc:pb:acctAdd:rptAddFields:1:actFields']")).sendKeys(sh.getRow(1).getCell(8).getStringCellValue());
      Thread.sleep(2000);
      driver.findElement(By.xpath(".//*[@id='pg:acc:pb:acctAdd:rptAddFields:3:actFields']")).sendKeys(sh.getRow(1).getCell(9).getStringCellValue());

      String mainWindow = driver.getWindowHandle();
      driver.findElement(By.xpath(".//*[@id='pg:acc:pb:acctAdd:rptAddFields:5:actFields_lkwgt']/img")).click();
      Thread.sleep(5000);
      Set<String> winhand = driver.getWindowHandles();
        for(String str : winhand)
        {   
            if(!str.equalsIgnoreCase(mainWindow))
            {
                driver.switchTo().window(str);
                break;
            }
        }
        try
        {

            driver.switchTo().frame("searchFrame");
            driver.findElement(By.xpath(".//*[@id='lksrch']")).sendKeys(sh.getRow(1).getCell(10).getStringCellValue());
            driver.findElement(By.xpath(".//*[@id='theForm']/div/div[2]/input[2]")).click();
            Thread.sleep(5000);
            driver.switchTo().frame("resultsFrame");
            driver.findElement(By.linkText(sh.getRow(1).getCell(10).getStringCellValue())).click();
            driver.switchTo().window(mainWindow);

            driver.findElement(By.xpath(".//*[@id='pg:acc:pb:acctAdd:rptAddFields:7:actFields_lkwgt']/img")).click();
            Thread.sleep(5000);
            Set<String> winhandle = driver.getWindowHandles();
            for(String str : winhandle)
            {   
                if(!str.equalsIgnoreCase(mainWindow))
                {
                    driver.switchTo().window(str);
                    break;
                }
            }
            try
            {
                driver.switchTo().frame("searchFrame");
                driver.findElement(By.xpath(".//*[@id='lksrch']")).sendKeys(sh.getRow(1).getCell(11).getStringCellValue());
                driver.findElement(By.xpath(".//*[@id='theForm']/div/div[2]/input[2]")).click();
                Thread.sleep(5000);
                driver.switchTo().frame("resultsFrame");
                driver.findElement(By.linkText(sh.getRow(1).getCell(11).getStringCellValue())).click();
                driver.switchTo().window(mainWindow);
            }
            catch(Exception e)
            {
                e.printStackTrace(); 
                System.out.println();
                driver.close();
                driver.switchTo().window(mainWindow);
                System.out.println("State/Region not Found");
            } 

        }
        catch(Exception e)
        {
            e.printStackTrace();
            System.out.println();
            driver.close();
            driver.switchTo().window(mainWindow);           
        } 

        driver.findElement(By.xpath(".//*[@id='pg:acc:pb:j_id34:save']")).click();

1 个答案:

答案 0 :(得分:1)

在切换到resultsFrame之前,请尝试切换到defaultContent或您的主框架,然后切换到resultsFrame。事情是webdriver在当前上下文中搜索框架。所以在searchFrame下它永远不会找到resultsFrame(因为两者都可能在主框架下)。

希望这有帮助。