循环无法正常工作

时间:2015-04-22 11:58:25

标签: java selenium selenium-webdriver

我在下面写了这个循环。它在第一次迭代中执行得非常好;但是,在第二次迭代中,它返回以下错误:

 Unable to locate element: 

    {"method":"xpath","selector":"html/body/header[2]/div[2]/nav/ul/li[2]/a"}`

Command duration or timeout: `120.06` seconds

循环代码如下所述:

    Workbook w2;
    w2 = Workbook.getWorkbook(new File("C:\\Users\\pcs\\Desktop\\flightdata.xls")); //flight data destintion location will be same as source from flight data.
    Sheet s2 = w2.getSheet(0);

    for (k = 1; k < s2.getRows(); k++)
    {   
      //redeem flow
      d1.findElementByXPath("html/body/header[2]/div[2]/nav/ul/li[2]/a").click();
      d1.findElementByXPath("html/body/header[2]/div[2]/nav/ul/li[2]/ul/li[3]/a").click();
      d1.findElement(By.xpath("html/body/section/div[1]/form/div/div[2]/div[1]/div/div[1]/input")).sendKeys(s2.getCell(0, k).getContents());

      //pause for list to be populated
      try 
      {
        Thread.sleep(1000L);
      }
      catch (Exception e)
      {
      }

      //Get all items in autocomplete list
      List<WebElement> items1 = d1.findElements(By.xpath("html/body/ul/li[3]/a"));

       //Look for item 
       for( i= 0; i <items1.size();i++)
       {
         if(items1.get(i).getText().contains(s2.getCell(0, k).getContents()))
         {
           items1.get(i).click();
           break; 
         }
       }  

         //calendar handling
         d1.findElementById("checkin").click();
         d1.findElementByXPath("html/body/div[2]/div[2]/div/a/span").click();
         d1.findElementByXPath("html/body/div[2]/div[2]/table/tbody/tr[3]/td[3]/a").click();

        //Select Number of Rooms
        d1.findElementById("roomscount").sendKeys("1");

        //Select Room type       
        d1.findElementById("roomtype").sendKeys("Single"); 

        //Occupant's Nationality    
        d1.findElementById("nationality").sendKeys("India");

        //Click search button       
        d1.findElementByXPath("html/body/section/div[1]/form/div/div[2]/div[4]/input").click();

        //after 2 min wait               
        d1.manage().timeouts().implicitlyWait(120, TimeUnit.SECONDS);
    }  

POST SEARCH HTML PAGE

    <!DOCTYPE html>
    <html>
    <head>
    <body class="" ondrop="return false;" ondragstart="return false;" onunload="" onpageshow="if (event.persisted) noBack();" onload="noBack();">
    <header>
    <div class="logo">
    <div class="right">
    <ul class="login">
    <nav class="links">
    <ul>
    <li>
    <li>
    <a href="#">Redeem sMiles</a>
    <ul>
    <li class="pointer sprite"> </li>
    <li class="flight">
    <li class="hotel">
    <a href="hotel.html?action=hotels">
    <span class="sprite"> </span>
    Hotels
    </a>
    </li>
    <li class="smiles">
    </ul>
    </li>
    </ul>
    </nav>
    <div class="clear"></div>
    </div>
    <div class="clear"></div>
    </header>
    <div class="clear"></div>
    <script src="/fm/travel/js/hotel.js" type="text/javascript">
    <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
    <link type="text/css" rel="stylesheet" href="/fm/styles/demo_table_jui.css">
    <link rel="stylesheet" href="/fm/travel/styles/ui-lightness/jquery-ui-1.10.4.css">
    <link rel="stylesheet" href="/fm/travel/styles/ui-lightness/autocomplete.css">
    <script src="/fm/travel/js/jquery-1.10.2.js" type="text/javascript">
    <script src="/fm/travel/js/jquery-ui-1.10.4.js" type="text/javascript">
    <script src="http://maps.googleapis.com/maps/api/js?key=AIzaSyDY0kkJiTPVd2U7aTOAwhc9ySH6oHxOIYM&sensor=false">
    <script type="text/javascript">
    <script type="text/javascript">
    <script type="text/javascript">
    <div id="loader" style="display: none;">
    <div id="modifySearchBlock" style="display: block;">
    <div class="clear"></div>
    <footer>
    <script src="/fm/travel/js/jquery.js">
    <script src="/fm/js/bootstrap.min.js">
    <script src="/fm/js/jquery.meanmenu.js">
    <script>
    <script src="/fm/js/jquery.simpleGal.js">
    <script>
    <script src="/fm/js/owl.carousel.js">
    <script>
    <div id="ui-datepicker-div" class="ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>
    <ul id="ui-id-1" class="ui-autocomplete ui-front ui-menu ui-widget ui-widget-content ui-corner-all " tabindex="0" style="display: none;"></ul>
    </body>
    </html>

以上代码属于搜索完成后我返回的页面。

我再次需要转到以下链接进行搜索:

enter image description here

<li class="flight">
<li class="hotel">
<a href="hotel.html?action=hotels">
<span class="sprite"> </span>
Hotels
</a>
</li>
<li class="smiles">
</ul>
</li>

以上代码属于我需要点击的链接。请提供相同的建议。

2 个答案:

答案 0 :(得分:1)

首先你应该看看除了xpath之外的其他选择器,它是不可读的,可以是dangeroushere你可以找到很多元素。例如cssSelector是一种非常可靠的查找元素的方法 另一个优点是您的代码更易读。

如果我理解,第一次迭代没问题,那么seconde one,这就是点击页面顶部导致崩溃的下拉列表。

一种可能的解决方案是,您的页面在循环结束时不会恢复到原始状态。您可以在循环结束时刷新页面:

driver.navigate().refresh();  

或者检查循环结束时的状态。

希望有所帮助。

答案 1 :(得分:-1)

嗯,我的代码面临的问题是,当搜索完成时,我试图尝试使用相同的旧xpath点击Web元素。实际上,经过仔细分析,我发现结果页面上相同webelements的xpath略有改变,因为我的脚本无法识别新位置上的元素。

因此,我只是改变了xpath并解决了问题。