在导航栏上使用selenium定位器的正确方法

时间:2016-11-10 19:40:37

标签: html selenium

我花了很多时间自己学习硒,我选择了一个网站“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">&nbsp;</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">&nbsp;</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">&nbsp;</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">&nbsp;</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">&nbsp;|&nbsp;</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">&nbsp;</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 &amp; 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 &amp; 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">&nbsp;</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 &amp; 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">&nbsp;</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 &amp; 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">&nbsp;</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>

总结: -

  • 如果我实现定位器的方法不合适,请纠正我,如何在不提取特定区域的元素的情况下提取特定区域的表格   较低的子表*

    如果我不能用几句话概括所有这些,我道歉。我希望堆栈溢出有附件可以让我的生活更轻松

2 个答案:

答案 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