【问题标题】:Selenium Click different ID linkSelenium 点击不同的 ID 链接
【发布时间】:2017-05-27 17:17:01
【问题描述】:

如何在 Selenium Framework 中单击具有不同 id 属性值的不同 a 元素? 链接ahref值是相同的文本。

<li>
<a id="abc_differentName_1_default_fun" href="javascript:startClient('abc_differentName_1', 'default', 'fun');">Start</a>
</li>

<li>
<a id="abc_differentName_2_default_fun"   href="javascript:startClient('abc_differentName_2', 'default', 'fun');">Start</a>
</li>

<li>
<a id="xyz_differentName_xyz_default_fun" href="javascript:startClient('xyz_differentName_xyz', 'default', 'fun');">Start</a>
</li>

我不想创建每个链接的一键式方法。

我的问题是我不想创建每个链接的一键式方法。我想要一键式方法取决于 id 名称。可以创建点击方法示例:void clickByIdName(String idName) ?? 取决于我点击了哪个链接,它将打开新窗口(其他页面对象)。

非常感谢。

【问题讨论】:

  • click on different ahref ID 是什么意思?你的意思是a 元素具有不同的id 属性值吗?
  • 是的。我正在考虑单击页面上不同的元素 id。所有链接文本都有相同的“开始”。

标签: java selenium


【解决方案1】:

如果页面上有多个文本相似的链接,您可以使用id值来选择每个元素,如下所示:

driver.findElement(By.cssSelector("a#abc_differentName_1_default_fun")).click();
driver.findElement(By.cssSelector("a#abc_differentName_2_default_fun")).click();
driver.findElement(By.cssSelector("a#xyz_differentName_xyz_default_fun")).click();

【讨论】:

  • 谢谢。我的问题是我不想创建每个链接的一键式方法。我想要一键式方法取决于 id 名称。可以创建点击方法示例:void clickByIdName(String idName) ??
  • 是的,试试public void clickByIdName(String idName) { driver.findElement(By.id(idName)).click(); }
  • 谢谢!现在我在我的测试用例中使用这里。你认为这是一个糟糕的测试方法/测试代码吗? pageObject.clickByGameName("abc_gameName_default_funMode"); pageObject.clickByGameName("abc_gameName_default_moneyMode");
  • 每个元素(取决于标签)可以具有id 属性和name 属性,也可以只有其中一个或一个都没有。使用 clickByGameName()id 作为参数可能会造成一些混乱。 clickByGameId() 可能更有意义......但这取决于你:)
【解决方案2】:

您不必使用这些 ID 属性值来定位链接元素。有一个更好的方法 - link text 定位器。您可以找到所有带有Start链接文本的链接,然后通过索引选择您需要获取的链接:

List<WebElement> links = driver.findElements(By.linkText("Start"));
links.get(0).click();

【讨论】:

  • 谢谢。我的问题是我不想创建每个链接的一键式方法。我想要一键式方法取决于 id 名称。可以创建点击方法示例:void clickByIdName(String idName) ??
  • 谢谢!现在我在我的测试用例中使用这里。你认为这是一个糟糕的测试方法/测试代码吗? pageObject.clickByGameName("abc_gameName_default_funMode"); pageObject.clickByGameName("abc_gameName_default_moneyMode");
【解决方案3】:

不确定这里的确切问题是什么,但这些有什么问题:

driver.findElement(By.id("abc_differentName_1_default_fun")).click();
driver.findElement(By.id("abc_differentName_2_default_fun")).click();
driver.findElement(By.id("xyz_differentName_xyz_default_fun")).click();

【讨论】:

  • 谢谢!现在我在我的测试用例中使用这里。你认为这是一个糟糕的测试方法/测试代码吗? pageObject.clickByGameName("abc_gameName_default_funMode"); pageObject.clickByGameName("abc_gameName_default_moneyMode");
【解决方案4】:

您可以使用 css 选择器查找所有 id 包含以下内容的元素:

driver.findElements(By.cssSelector("[id*=_differentName_]"))

如果你想要void clickByIdName(String idName)

void clickByIdName(String idName) {
    driver.findElement(By.Id(idName)).click();
}

【讨论】:

  • ...再一次 - 右括号:)
  • 我在等你的评论 :)
  • 谢谢。我的问题是我不想创建每个链接的一键式方法。我想要一键式方法取决于 id 名称。可以创建点击方法示例:void clickByIdName(String idName) ??
  • 我用你想要的方法更新了答案,但我不建议使用它。代码太简单,无法封装成函数。
  • 这取决于你想要什么。如果名称 clickByGameName 可以帮助您更轻松地阅读测试步骤,那么是的,您可以使用它。只是,如果每个游戏都以abc_gameName_default_开头,我会把那部分放在clickByGameName方法中,然后你可以调用pageObject.clickByGameName("funMode")
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-06
  • 2013-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-12
相关资源
最近更新 更多