建议在网页上定位元素我正在构建一个selenium脚本

时间:2014-11-19 15:38:37

标签: selenium xpath selenium-webdriver

我正在就我正在构建的Selenium脚本提出一些建议。我正在撰写selenium脚本的网页的屏幕截图附有Screenshot。我有一个网页,我将鼠标悬停在导航窗格中的“报告”文本上,这会显示一个菜单......从那个菜单我选择'资产管理',然后'终止报告:已完成'从子菜单。

我已经附上了下面的selenium代码,其中突出了我要做的事情......我认为最好的方法是通过xpath,因为没有大量的信息可以解决元素。

public class optionFocusControls {

//REPORTS TAB   
public static void reportWindowFocus(InternetExplorerDriver driver){
    WebElement reportWindowFocus = driver.findElement(By.linkText("Reports"));
    Actions hoverOnReportText = new Actions(driver);
    hoverOnReportText.moveToElement(reportWindowFocus).build().perform();           
}

public static void assetManagementFocus(InternetExplorerDriver driver){
    WebElement assetManagementFocus = driver.findElement(By.xpath("html/body/div[1]/form/div[2]/div/ul/li[4]/ul/li[1]/a"));     
    Actions hoverOnReportWindow = new Actions(driver);
    hoverOnReportWindow.moveToElement(assetManagementFocus).build().perform();
}

public static void daysInStockFocus(InternetExplorerDriver driver){
    WebElement daysInStockFocus = driver.findElement(By.xpath("html/body/div[1]/form/div[2]/div/ul/li[4]/ul/li[1]/ul/li[1]/a"));
    Actions hoverOnDaysInStock = new Actions(driver);
    hoverOnDaysInStock.moveToElement(daysInStockFocus).build().perform();
    daysInStockFocus.click();
}


public static void terminatedReportCompletedFocus(InternetExplorerDriver driver){
    WebElement terminatedReportCompletedFocus = driver.findElement(By.xpath("html/body/div[1]/form/div[2]/div/ul/li[4]/ul/li[1]/ul/li[2]/a"));      
    Actions hoverOnReportWindow = new Actions(driver);
    hoverOnReportWindow.moveToElement(terminatedReportCompletedFocus).build().perform();
    terminatedReportCompletedFocus.click();
}

}

我还从网页上附上了HTML(截图2,希望能够了解我是如何在Selnenium中构建上述测试脚本的(格式化道歉!)

body class="customer-search">
<div id="wrapper">
<form id="aspnetForm" action="CustomerSearch.aspx" method="post">
<div class="aspNetHidden">
<div id="top-nav">
<div class="inner">
<img id="ctl00_Img1" alt="*" src="../Images/chinook/gfx-topnav-left.gif">
<ul class="drop-down-menu sub-nav">
<li>
<li id="GN02">
<li id="GN03">
<li>
<a class="" href="../CCLReports/Overall">Reports</a>
<ul id="ddm-74938" style="display: none;">
<li>
<a class="" href="#">Asset Management</a>
<span>»</span>
<ul style="display: none;">

我遇到的问题是我想要达到'资产管理'&gt; '终止报告:已完成'页面。在我检查了该页面后,我想转到“资产管理”&gt; '终止报告:待定'页面。但是,当我选择“终止报告:待定”时,选择“资产管理”选项时的XPath现在与我去“终止电子报告:已完成”时的情况不同,甚至认为选择它是相同的。 ....我假设这是因为我从不同的页面选择菜单选项,这会改变Xpath吗?基于以上所述,我有两个问题,我希望得到以下方面的帮助:  1)鉴于看起来XPath不是我导航这个导航菜单的最佳方式,为了到达所需的位置,最好的元素定位器是什么?  2)我遇到的另一个问题是,当我到达页面时,使用上面的硒代码,焦点仍然是我从菜单中选择的选项,例如'终止报告:已完成'。这使我无法选择页面上的任何元素,我无法看到任何解决方法。是否存在可以将焦点切换到整个网页的操作,因此我可以完成我需要的任何操作。

1 个答案:

答案 0 :(得分:1)

XPath和CssLocators非常灵活,因为它们支持多种识别元素的方法。我不确定你会找到更好的选择。 This是他们可以做的很好的参考。

您的方法非常严格,因为您的xpath字符串指定了完整的层次结构 - 您要搜索的元素及其所有父元素。如果该层次结构中的任何元素发生更改或重新排序,则会失败。

根据您的html代码段,链接文字是识别我们元素的最独特键。这并不理想,因为我们可以遇到具有相同文本的其他链接,但我们可以使用父或兄弟关系与其他元素来提高稳健性。

我们所有的菜单元素都位于顶部导航栏中,因此我们可以将搜索范围限制为其后代。未指定的路径查找//让我们跳过说明完整的层次结构链并使用更通用的关系。

e.g。

public static void daysInStockFocus(InternetExplorerDriver driver){
    WebElement daysInStockFocus = driver.findElement(By.xpath("//div[@id='top-nav']//a[contains(text(),'Asset Management')]"));
    Actions hoverOnDaysInStock = new Actions(driver);
    hoverOnDaysInStock.moveToElement(daysInStockFocus).build().perform();
    daysInStockFocus.click();
}

public static void terminatedReportCompletedFocus(InternetExplorerDriver driver){
    WebElement terminatedReportCompletedFocus = driver.findElement(By.xpath("//div[@id='top-nav']//a[contains(text(),'Terminated Report: Completed')]"));      
    Actions hoverOnReportWindow = new Actions(driver);
    hoverOnReportWindow.moveToElement(terminatedReportCompletedFocus).build().perform();
    terminatedReportCompletedFocus.click();
}