我正在就我正在构建的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)我遇到的另一个问题是,当我到达页面时,使用上面的硒代码,焦点仍然是我从菜单中选择的选项,例如'终止报告:已完成'。这使我无法选择页面上的任何元素,我无法看到任何解决方法。是否存在可以将焦点切换到整个网页的操作,因此我可以完成我需要的任何操作。
答案 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();
}