首页 > 解决方案 > 如何使用 Selenium 和 java 单击 WebTable 任何页面上的 WebElement

问题描述

大家好,我正在尝试单击 Webtable 的每个页面上存在的 WebElement(CheckBox)(即 WebTable 的分页),但我想单击通过 Xpath 传递的那个 Perticular Checkbox。

以下是我尝试过的代码

HTML:

<form id="vContactsForm" action="https://www.freecrm.com/system/index.cfm" method="post">
<table class="datacard" width="100%" cellspacing="3" cellpadding="2" border="0">
    <tbody><tr><td class="datacardtitle" colspan="8" valign="top" align="left">
        <table width="100%" cellspacing="0" cellpadding="0" border="0">
        <tbody><tr><td class="datacardtitle" valign="top" align="left">

        Contacts
        </td>
        <td class="datacardtitle" valign="top" align="right">

            <input class="button" value="Export" onclick="exportResultSet('query_slct_contacts_full');" type="button"> |
            <input class="button" value="Shortlist All Results" onclick="flagResultSet('query_slct_contacts_full', 'CONTACT', this);" type="button"> |
            <input class="button" value="New Contact" onclick="go('https://www.freecrm.com/system/index.cfm?action=contact&amp;sub=load&amp;client_id=&amp;edit=1');" type="button">
        </td></tr></tbody></table>

        </td></tr>

        <tr><td colspan="7" valign="top" align="left">
            <div class="pagination">Pages : <strong>1</strong> | <a 
href="https://www.freecrm.com/system/index.cfm? 
sr=21&amp;action=contact&amp;sub=start&amp;fl=&amp;">2</a> | <a 
href="https://www.freecrm.com/system/index.cfm? 
sr=41&amp;action=contact&amp;sub=start&amp;fl=&amp;">3</a> | <a 
href="https://www.freecrm.com/system/index.cfm? 
sr=61&amp;action=contact&amp;sub=start&amp;fl=&amp;">4</a> | <a 
href="https://www.freecrm.com/system/index.cfm? 
sr=81&amp;action=contact&amp;sub=start&amp;fl=&amp;">5</a> | <a 
href="https://www.freecrm.com/system/index.cfm? 
sr=101&amp;action=contact&amp;sub=start&amp;fl=&amp;">6</a> | <a 
href="https://www.freecrm.com/system/index.cfm? 
sr=121&amp;action=contact&amp;sub=start&amp;fl=&amp;">7</a> | <a 
href="https://www.freecrm.com/system/index.cfm? 
sr=141&amp;action=contact&amp;sub=start&amp;fl=&amp;">8</a> | </div> 
        </td>
            <td valign="top" align="right">


Java Code:

public class ClickOnAnyPageLink {

public static void main(String[] args) throws InterruptedException {

    System.setProperty("webdriver.chrome.driver", System.getProperty("user.dir")+"//All_Drivers//chromedriver.exe");

    WebDriver driver = new ChromeDriver();
    driver.get("https://freecrm.com");
    driver.manage().window().maximize();
    driver.manage().deleteAllCookies();
    driver.findElement(By.name("username")).sendKeys("*****");
    driver.findElement(By.name("password")).sendKeys("*****");
    driver.findElement(By.xpath("//input[@type='submit' and @value='Login']")).click();
    driver.switchTo().frame("mainpanel");
    driver.findElement(By.xpath("//a[contains(text(),'Contacts')]")).click();

    Thread.sleep(5000);

    List<WebElement> all_pages = driver.findElements(By.xpath("//form[@id='vContactsForm']/descendant::div[1]/a"));

    System.out.println(all_pages.size());//7

    Iterator<WebElement> pageiterator = all_pages.iterator();

    while(pageiterator.hasNext())
    {
        WebElement elem = pageiterator.next();
        elem.click();// on second page
        Thread.sleep(3000);

        WebElement elem1 = driver.findElement(By.xpath("//a[contains(text(),'nnn jhjhjk')]/parent::*/preceding-sibling::*/child::*"));

        if(elem1.isDisplayed())
        {
            elem1.click();  
            break;
        }

    }

    driver.close();
}

}

但我在这里面临的问题是Element not found Exception。因为 Page 只被单击一次,它不会对 WebTable 的每个页面进行迭代并检查该 Perticular Checkbox 的存在。

此 xpath 发生异常: //a[contains(text(),'nnn jhjhjk')]/parent::*/preceding-sibling::*/child::*

我不明白我在这里缺少什么,希望我很清楚。任何帮助将不胜感激。谢谢

标签: javaselenium

解决方案


您能否尝试将 if 循环更改为以下内容,并让我知道它是否适合您 -

List<WebElement> elem1 = driver.findElements(By.xpath("//a[contains(text(),'nnn jhjhjk')]/parent::*/preceding-sibling::*/child::*"));

        if(elem1.size()>0)
        {
            elem1.click();  
            break;
        }

这是假设你只得到一个元素。请让我知道它是否有效。


推荐阅读