我花了很多时间自己学习硒,我选择了一个网站“actiTime.com”来练习我学到的东西,当我开始自动化脚本时,我遇到了一个问题让我感到难过两天。我认为这是个好地方,因为你们是这个领域的专家。
这是一个包含HTML Grid中所有内容的导航菜单。我的查询这种方法适合使用此定位器来提取导航栏上菜单的名称
我正在尝试提取导航栏的名称,即时间跟踪,任务,报告,用户(实际上是Web应用程序的模块)
我的代码:
public class Test50_misc extends Browser{
public static void main(String[] args) throws FileNotFoundException {
call_chrome();<-System property
WebDriver driver =new ChromeDriver();
driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
driver.get("https://online.actitime.com/adbc/login.do");
driver.findElement(By.xpath(".//*[@id='username']")).sendKeys("xxxxx");
driver.findElement(By.xpath(".//*[@name='pwd']")).sendKeys("xxxxx");
driver.findElement(By.xpath(".//*[@id='loginButton']")).click();
StringBuilder sb=new StringBuilder();
WebElement e=driver.findElement(
By.xpath(".//table[@class ='navTable']//tr[1]"));//Reducing the scope of driver that particular area
List<WebElement>all_links=e.findElements(By.xpath("//div[contains(@class,'label')]"));
for(WebElement element:all_links){
sb.append(element.getAttribute("innerHTML")).append(" : ");//HOW TO USE STRING BUILDER
}
System.out.println(sb);
}
}
预期输出 : - 时间轨迹:任务:报告:用户:
实际输出是 时间跟踪:任务:报告:用户: 设置 : 附加组件 : 救命 : 提示 : 选择客户或项目 :
这不是我感兴趣的,因为它包含了另一个子表的项目(帮助,提示..)
Html Dom结构
<div class="navBg withSubMenu">
<table class="navTable" cellpadding="0" cellspacing="0" id="topnav" style="cursor: default;">
<tbody><tr>
<td class="logoCell navCell" valign="top">
<div style="position: relative">
<div><img src="/adbc/img/ferngreen/pixel.gif?hash=993496393" height="1" width="190"></div>
<div style="padding:19px 0 0 28px"><img src="/adbc/img/ferngreen/top_nav/default-logo.png?hash=993496393" height="44" width="145"></div>
</div>
</td>
<td class="navItem navCell relative selected">
<a class="content selected tt">
<div class="label">TIME-TRACK</div>
<div class="img"> </div>
</a>
</td>
<td class="navItem navCell relative notSelected">
<a href="/adbc/tasks/otasklist.do" class="content tasks"><div class="label" style="z-index:155; ">TASKS</div>//<----Label
<div class="img"> </div></a>
</td>
<td class="navItem navCell relative notSelected">
<a href="/adbc/reports/reports.do" class="content reports"><div class="label" style="z-index:155; ">REPORTS</div>
<div class="img"> </div></a>
</td>
<td class="navItem navCell relative notSelected">
<a href="/adbc/administration/userlist.do" class="content users"><div class="label" style="z-index:155; ">USERS</div>
<div class="img"> </div></a>
</td>
<td class="menuCell navCell" valign="top">
<table cellpadding="0" cellspacing="0">
<tbody><tr>
<td valign="top">
</td>
<td valign="top">
<div class="menuCellDiv">
<table class="menuTableWrap" cellpadding="0" cellspacing="0" border="0">
<tbody><tr class="logoutContainer">
<td class="profileCell">
<a class="userProfileLink username" href="javascript:void(0)" onclick="onUserProfileLinkClicked(); return false;">
adda
london
</a>
</td>
<td class="logoutSeparator"> | </td>
<td class="logoutCell">
<a href="/adbc/logout.do" id="logoutLink" class="logout">Logout</a>
</td>
</tr>
<tr>
<td colspan="3">
<div class="menuTable">
<div class="topMenuButton">
<div class="popup_menu_container">
<div class="popup_menu_button popup_menu_button_settings" onclick="PopupMenu.show(event, $('#popup_menu_settings'));">
<div class="popup_menu_icon settings_icon">
</div>
<div class="popup_menu_label">
Settings
<div class="popup_menu_arrow"> </div>
</div>
</div>
<div id="popup_menu_settings" class="popup_menu_body">
<div class="popup_beak"></div>
<div class="popup_menu_content popup_menu_settings">
<div class="popup_menu_ul">
<div class="popup_menu_title">
SETTINGS
</div>
<ul id="popup_menu_items_content" class="popup_menu_items">
<li class="popup_menu_separator"></li>
<li class="popup_menu_item" id="popup_menu_item_1"><a href="/adbc/administration/features.do" class="item_link"><div class="item_title">Turn Features On / Off</div>
<div class="item_descr">Review features and decide what you need</div></a></li>
<li class="popup_menu_separator"></li>
<li class="popup_menu_item" id="popup_menu_item_6">
<a href="/adbc/administration/settings.do?noReload=false" class="item_link"><div class="item_title">
General Settings
</div>
<div class="item_descr">Manage system settings & configure actiTIME</div></a>
</li>
<li class="popup_menu_separator"></li>
<li class="popup_menu_item" id="popup_menu_item_2" style=" "><a href="/adbc/administration/btlist.do" class="item_link">Types of Work</a></li>
<li class="popup_menu_item" id="popup_menu_item_3" style=" "><a href="/adbc/administration/ltlist.do" class="item_link">Leave ypes</a></li>
<li class="popup_menu_item" id="popup_menu_item_4"><a href="/adbc/administration/workingdays.do" class="item_link">Work Schedule</a>
利&GT;
<li class="popup_menu_item" id="popup_menu_item_5"><a href="/adbc/administration/notifications.do" class="item_link">Notifications</a></li>
<li class="popup_menu_separator"></li>
<li class="popup_menu_item" id="popup_menu_item_7"><a href="/adbc/administration/customization.do" class="item_link">Logo & Color Scheme</a></li>
<li class="popup_menu_item" id="popup_menu_item_8"><a href="/adbc/administration/manage_licenses.do" class="item_link">Licenses</a></li>
</ul>
</div>
</div>
</div>
</div>
</div>
<div class="topMenuButton">
<div class="popup_menu_container">
<div class="popup_menu_button popup_menu_button_addons" onclick="PopupMenu.show(event, $('#popup_menu_addons'));">
<div class="popup_menu_icon addons_icon"></div>
<div class="popup_menu_label">
Add-ons
<div class="popup_menu_arrow"> </div>
</div>
</div>
<div id="popup_menu_addons" class="popup_menu_body">
<div class="popup_beak"></div>
<div class="popup_menu_content popup_menu_addons">
<div class="popup_menu_ul">
<div class="popup_menu_title">
ADD-ONS
</div>
<ul class="popup_menu_items">
<li class="popup_menu_separator"></li>
<li class="popup_menu_item"><a class="item_link has_icon mobile_icon" href="https://www.actitime.com/actitime-mobile-app.html" target="_blank">
<div class="item_title">actiTIME mobile app</div>
<div class="item_descr">FREE mobile application for iPhone & Android</div>
</a></li>
<li class="popup_menu_separator"></li>
<li class="popup_menu_item"><a class="item_link has_icon qb_icon" href="https://www.actitime.com/timesheet-quickbooks-integration.html" target="_blank">
<div class="item_title">Integration with QuickBooks</div>
<div class="item_descr">Import working and leave time into QuickBooks</div>
</a></li>
<li class="popup_menu_separator"></li>
<li class="popup_menu_item">
<a class="item_link has_icon actiplans_icon" href="javascript:void(0)" onclick="openAtIntegrationPopup(); return false;">
<div class="item_title">Integration with actiPLANS</div>
<div class="item_descr" style="white-space: pre-wrap;">Interactive schedule for planning leaves and checking collegues' presence at work</div>
</a>
</li>
</ul>
</div>
</div>
</div>
</div>
</div>
<div class="topMenuButton">
<div class="popup_menu_container">
<div class="popup_menu_button popup_menu_button_support" onclick="openHelpAndSupportMenu(event)">
<div class="popup_menu_icon support_icon"></div>
<div class="popup_menu_label">
Help
<div class="popup_menu_arrow"> </div>
</div>
</div>
<div id="popup_menu_support" class="popup_menu_body popup_menu_support_container">
<div class="popup_beak"></div>
<div class="popup_menu_content popup_menu_support demoDataLoaded inviteUsersPossible">
<div id="demoDataContainer" class="demoDataContainer">
<div class="demoDataScrollContainer">
<div class="firstTextBlock">
<span class="demoDataLoadedTitle">Demo Data Loaded</span>
<div class="demoDataLoadedNote">
To save your time for the product review we've preloaded sample data (Users, Tasks, etc.).<br><br>
You can remove these data anytime when you are ready to start working with product.
</div>
</div>
<div id="cleanDemoDataButton" class="cleanDemoDataButton">Clean up Demo Data</div>
<div class="removeDemoDataText">Preloaded Demo Data will be removed from actiTIME. All data created by you (Settings, Customers, Projects, Tasks, Users, etc.) will be kept in the system.</div>
<div id="proceedCleanDemoDataButton" class="proceedCleanDemoDataButton">Proceed with Clean up</div>
<div id="cancelDemoDataClenup" class="cancelDemoDataClenup">Cancel</div>
</div>
</div>
<div id="inviteUserFromHelpPopup" class="inviteUserFromHelpPopup">
<div class="scrollInviteContainer">
<div class="inviteTeamPicture"><img src="/adbc/img/ferngreen/support/team-pic-demo.png?hash=993496393"></div>
<div id="popup_menu_support_createAccountColleague" class="createAccountColleague">Create account for your colleague</div>
<div class="inviteInputFieldsContainer">
<div style="width: 250px">
<input id="popup_menu_support_firstNameInviteMenu" maxlength="32" class="firstNameInviteMenu inputFieldWithPlaceholder" type="text" placeholder="First Name"><!-- this comment is needed to remove space between inputs
--><input id="popup_menu_support_lastNameInviteMenu" maxlength="32" class="lastNameInviteMenu inputFieldWithPlaceholder " type="text" placeholder="Last Name">
</div>
<input id="popup_menu_support_emailInviteMenu" class="emailInviteMenu inputFieldWithPlaceholder" type="text" placeholder="Email">
<div>
<div id="popup_menu_support_sendInvitationButton" class="sendInvitationButton">Send Invitation</div>
<div id="popup_menu_support_cancelInvitationButton" class="cancelInvitationButton">Cancel</div>
</div>
</div>
</div>
<div class="sendInvitationContainer">
<div class="mailImageBg">
<div class="mailImage"></div>
</div>
<div class="textsAndButtons">
<div id="popup_menu_support_invitedText" class="invitedText"></div>
<div id="popup_menu_support_errorInviteText" class="errorInviteText"></div>
<div id="popup_menu_support_inviteAnotherPersonButton" class="inviteAnotherPersonButton">Invite another person</div>
<div id="popup_menu_support_closeInviteButton" class="closeButton">Close</div>
</div>
</div>
</div>
<div id="popup_menu_support_inviteColleaguesErrorTooltip" class="yellowTooltip tooltipText" style="display: none;">
<div id="popup_menu_support_inviteColleaguesErrorTooltipTextPlaceholder"></div>
</div>
<div class="popup_menu_ul">
<div class="popup_menu_title">
HELP & SUPPORT
</div>
<ul class="popup_menu_items">
<li class="popup_menu_separator"></li>
<li class="popup_menu_item"><a class="item_link" href="javascript:void(0);" onclick="MenuHandler.openIntroVideo('KJOoBh5s84w'); return false;" style="position: relative">
Introduction Video
<div class="icon_intro"></div>
</a></li>
<li class="popup_menu_separator"></li>
<li class="popup_menu_item"><a class="item_link" href="javascript:void(0);" onclick="MenuHandler.openUserGuide(); return false;">User Guide</a></li>
<li class="popup_menu_item"><a class="item_link" href="javascript:void(0);" onclick="MenuHandler.openFaq(); return false;">Frequently Asked Questions</a></li>
<li class="popup_menu_item"><a class="item_link" href="javascript:void(0);" onclick="MenuHandler.openAbout(); return false;">About your actiTIME</a></li>
<li class="popup_menu_separator"></li>
<li class="popup_menu_item"><a class="item_link" href="javascript:void(0);" onclick="MenuHandler.reportABug();">Contact actiTIME Support</a></li>
</ul>
</div>
<div id="requestCallPhoneContainer_support" class="requestCallPhone">
<div class="phoneInputBlock">
<div class="requestPhoneText">Need more info? Request a call:</div>
<div class="inputPhoneContainer">
<div id="countryCodePlaceholder_support" class="countryCodeSelector"></div>
<input maxlength="32" type="text" class="inputFieldWithPlaceholder phoneInput phonePlaceHolder" id="phoneInput_support" placeholder="Phone Number">
<div id="sendPhoneButton_support" class="sendPhoneButton">Send</div>
</div>
<div class="errorAnswer" style="display: none">
The server is not responding.
<div class="pleaseTryAgainButton">Please try again</div>
</div>
</div>
<div class="phoneSendBlock" style="display: none">
<div class="backgroundImage">
<div class="mailImage"></div>
</div>
</div>
<div class="phoneWasSendBlock" style="display: none">
<div class="thankText">Thanks, we received your request!</div>
<div class="contactWithUserText">We will contact you as soon as possible.</div>
<div id="closePhoneWasSendButton_support" class="closeButton">Close</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="topMenuButton">
<!--Tips menu button placeholder-->
<div class="popup_menu_container">
<div class="popup_menu_button popup_menu_button_tips" onclick="PageOverlayTipsManager.getInstance().toggle()">
<div class="popup_menu_icon tips_icon_light_on"></div>
<div class="popup_menu_label">
Tips
</div>
</div>
</div>
</div>
</div>
</td>
</tr>
</tbody></table>
</div>
</td>
</tr>
</tbody></table>
</td>
</tr>
<tr class="secondLevelRow">
<td class="secondLevelCell" colspan="1"> </td>
<td class="secondLevelCell selectedColNum1 " colspan="6">
<div class="secondLevelNavigationItem selected ">
<a class="item active">Enter Time-Track</a>
</div>
<div class="secondLevelNavigationItem ">
<a href="/adbc/user/view_tt.do" class="item">View Time-Track</a>
</div>
<div class="secondLevelNavigationItem ">
<a href="/adbc/user/lock_tt.do" class="item">Lock Time-Track</a>
</div>
<div class="secondLevelNavigationItem ">
<a href="/adbc/administration/approve_tt.do" class="item">Approve Time-Track</a>
总结: -
如果我实现定位器的方法不合适,请纠正我,如何在不提取特定区域的元素的情况下提取特定区域的表格 较低的子表*
如果我不能用几句话概括所有这些,我道歉。我希望堆栈溢出有附件可以让我的生活更轻松
答案 0 :(得分:0)
List<WebElement>all_links=driver.findElements(By.xpath("//table[@class ='navTable']//tr[1]//a[contains(@class,'content')]/div[contains(@class,'label')]"));
尝试使用此xpath,您可以删除代码中的第一个xpath搜索。我希望报道&#39;具有与xpath中相同的结构,它不包含在您发布的html中。
另一件事 - 从您的代码中这不正确List<WebElement>all_links=e.findElements(By.xpath("//div[contains(@class,'label')]"));
要在元素中进行搜索,您需要在xpath前加上一个点&#39 ;.&#39;否则将搜索整个文档,而不是将该元素用作上下文。
答案 1 :(得分:0)
鉴于HTML,你真的不需要XPath。您可以使用CSS选择器"div.label"
,例如driver.findElements(By.cssSelector("div.label"));
这将排除表格中的div
。
如果你看两组div
,你会发现它们是:
<div class="label" style="z-155">
<div class="pop_up_menu_label" ...>
所以这些上的类名实际上是不同的,可以很容易区分。
以下是CSS选择器的几个参考
https://www.w3.org/TR/selectors/#selectors
https://saucelabs.com/resources/articles/selenium-tips-css-selectors