Selenium Webdriver_Not能够点击列中的链接

时间:2014-10-18 10:45:51

标签: eclipse selenium selenium-webdriver

我是初学者,我正在尝试编写Selenium网络驱动程序。我正在使用eclipse并尝试在下一栏中找到可用的链接。在每一行中我都有不同的链接。例如,在我的员工数据表中,我在一个页面中有2列和10行。第一列包含person的名称,第二列包含其员工ID(ID是超链接)。我正在尝试选择任何员工的超链接,但我无法做到。

我有HTML代码和示例脚本。

<span id="37">

<div class="clear"></div>

<div id="FC_Schema.1021.WIP" type="DataCheckingList" name="FC_Schema.1021.WIP">

<input id="baseurl" type="hidden" value="/Web/" name="baseurl">

<input id="hdnDcCnt" type="hidden" value="13" name="hdnDcCnt">

<input id="PageNo" type="hidden" value="1" name="PageNo">

<meta content="width=device-width" name="viewport">

<style type="text/css">

<div id="DataCheckingLoad">

<div id="SupplyChainTabs">

<div id="gbo" class="InnerAlertsTabs">

<table id="one" class="draggable" width="100%">

<thead>

<tbody>

<tr>

<td valign="top" align="center">

<td valign="top">

<td valign="top">

<a onclick="return ButtonClick(this,'TxnyD.Communities.2.1','Org.2000476_Product.THQS|SMS|Questionnaire.WIP_Questionnaire_TxnyD.Communities.2.1_THQS_TxnyD.Operationaloffice.1.2');" href="#f">Axiom 
Process LLC</a>

<div class="country-name">

<div class="CompanyInfoContactLinks">

</td>

<td valign="top">

THQS

<div class="clear"> </div>

<a id="Org.2000476_Product.THQS|SMS|Questionnaire.WIP_Questionnaire_TxnyD.Communities.2.1_THQS_TxnyD.Operationaloffice.1.2" onclick="RedirectToQuestionnairePage(id)" href="#">THQS</a>

<div class="clear"> </div>

</td>

在上面的代码中,第一列包含公司名称,即“Axiom Process LLC“和第二列包含公司订阅名称,即”THQS“。我必须选择公司”Axiom Process LLC“的THQS链接

为它设计的Selenium脚本如下

public static void main(String[] args) throws Exception {
    WebDriver driver = new FirefoxDriver();
    driver.manage().window().maximize();
    driver.get("http://XXX.XXX.XXX.XXX/Web");
    Thread.sleep(1000);
    driver.findElement(By.xpath("//input[@id='UserName']")).sendKeys("Gbouser.1");
    driver.findElement(By.xpath("//input[@id='Password']")).sendKeys("****");
    driver.findElement(By.xpath("//input[@name='Login']")).click();

    driver.findElement(By.xpath("//a[contains(text(),'Task')]")).click();   
    driver.findElement(By.xpath("//a[contains(text(),'Data Checking')]")).click();
    driver.findElement(By.partialLinkText("Axiom")).findElement(By.xpath("//a[contains(text(),'THQS')]")).click();
}

所以基本上这些都是动态表,每次都有不同的记录。如何选择列中可用的链接?

我也尝试过以下脚本:

driver.findElement(By.name("*[id^='CLS'][id$='Demolition Limited']")).findElement(By.xpath("//a[contains(text(),'THQS')])[3]")).click();

1 个答案:

答案 0 :(得分:0)

欢迎来到Stackoverflow。在回答你的问题之前,只需几点。认为你有一个downvote&因为你没有很好地格式化你的问题。否则一个完全合法的问题,你会得到更早的帮助。

其次,请不要输入真实的网站地址,用户名和密码:)。我能够登录,并准确理解你需要什么,但一个恶意的人可以在那里做坏事。

要回答您的问题,请尝试此

,而不是导致您出现问题的行
    Thread.sleep(3000);
    TablePageObject tablePageObject = PageFactory.initElements(driver, TablePageObject.class);
    tablePageObject.clickLink("Axiom");

TablePageObject在哪里

public class TablePageObject {

    private WebDriver driver;

    @FindBy(css = "table tr")
    private List<WebElement> allTableRows; // find all the rows of the table

    public TablePageObject(WebDriver driver) {
        this.driver = driver;
    }

    public void clickLink(String companyName) {
        for(WebElement row : allTableRows) {
            List<WebElement> links = row.findElements(By.cssSelector("a"));
            // the first link by row is the company name, the second is link to be clicked
            if (links.get(0).getText().contains(companyName)) {
                links.get(3).click();
            }
        }

    }

}

解释,TablePageObject类将是您尝试控制的动态表的程序化句柄。它遵循硒的页面工厂模式,我衷心推荐,你可以在这里了解更多https://code.google.com/p/selenium/wiki/PageFactory

它基本上保存了表格的行集合,或多或少看起来像:

<tr>
    <td valign="top" align="center">
        // irelevant
    </td>
    <td valign="top">
        // irelevant
    </td>
    <td valign="top">
        <a>Axiom Process LLC</a>
        <a>company details</a>
        <a>web details</a>
    </td>
    <td valign="top">
        <a>THQS</a>
    </td>
    <td valign="top" align="center" style="display: none">
       // irelevant
    </td>
    <td valign="top">
        //irelevant
    </td>
    <td valign="top">
        // irelevant
    </td>
    <td valign="top">
    </td>
    <td>
        &nbsp;
    </td>
</tr>

您从表中收集所有链接,根据第一个链接检查公司名称,如果匹配,请单击第四个链接,

希望它有所帮助,最好,

顺便说一下,我在问题中掩盖了你的密码