循环工作不正常
The loop is not working correctly
我在下面写了这个循环。它在第一次迭代中执行得非常好;然而,在第二次迭代中,它 return 出现以下错误:
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 搜索 HTML 页
<!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>
以上代码属于我搜索完成后return的页面。
同样,我需要转到下面的 link 进行搜索:
<li class="flight">
<li class="hotel">
<a href="hotel.html?action=hotels">
<span class="sprite"> </span>
Hotels
</a>
</li>
<li class="smiles">
</ul>
</li>
以上代码属于我需要点击的link。请提供相同的建议。
首先你应该看看除 xpath 之外的其他选择器,它是不可读的并且可以 dangerous, here 你将有很多方法来查找元素。例如 cssSelector
是一种非常可靠的查找元素的方法。
另一个优点是您的代码变得更具可读性。
据我了解,第一次迭代没问题,然后是第二次迭代,这是导致崩溃的页面顶部下拉菜单的点击。
一个可能的解决方案是您的页面在循环结束时不会返回到其原始状态。您可以在循环结束时刷新页面:
driver.navigate().refresh();
或者检查您在循环结束时处于哪种状态。
希望对您有所帮助。
好吧,我的代码面临的问题是当搜索完成时,我试图单击具有相同旧 xpath 的 Web 元素。实际上,经过仔细分析,我发现结果页面上相同网络元素的 xpath 发生了轻微的变化,因此我的脚本无法识别新位置上的元素。
因此,我只是更改了 xpath,问题就解决了。
我在下面写了这个循环。它在第一次迭代中执行得非常好;然而,在第二次迭代中,它 return 出现以下错误:
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 搜索 HTML 页
<!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>
以上代码属于我搜索完成后return的页面。
同样,我需要转到下面的 link 进行搜索:
<li class="flight">
<li class="hotel">
<a href="hotel.html?action=hotels">
<span class="sprite"> </span>
Hotels
</a>
</li>
<li class="smiles">
</ul>
</li>
以上代码属于我需要点击的link。请提供相同的建议。
首先你应该看看除 xpath 之外的其他选择器,它是不可读的并且可以 dangerous, here 你将有很多方法来查找元素。例如 cssSelector
是一种非常可靠的查找元素的方法。
另一个优点是您的代码变得更具可读性。
据我了解,第一次迭代没问题,然后是第二次迭代,这是导致崩溃的页面顶部下拉菜单的点击。
一个可能的解决方案是您的页面在循环结束时不会返回到其原始状态。您可以在循环结束时刷新页面:
driver.navigate().refresh();
或者检查您在循环结束时处于哪种状态。
希望对您有所帮助。
好吧,我的代码面临的问题是当搜索完成时,我试图单击具有相同旧 xpath 的 Web 元素。实际上,经过仔细分析,我发现结果页面上相同网络元素的 xpath 发生了轻微的变化,因此我的脚本无法识别新位置上的元素。
因此,我只是更改了 xpath,问题就解决了。