无法使用Java和Selenium通过部分链接文本找到元素

无法使用Java和Selenium通过部分链接文本找到元素,java,selenium,selenium-webdriver,xpath,webdriverwait,Java,Selenium,Selenium Webdriver,Xpath,Webdriverwait,使用geckodriver 0.23.0、firefox 64.0.2、selenium 3.12、java 8,我无法通过部分链接文本找到元素。没有使用框架。链接文本为“帐户(1)”。“查看所有帐户”页面上只有一个相同文本的其他实例 html: 我尝试使用“帐户””和“帐户(”,它们都返回相同的404 not found-没有这样的元素错误 控制台日志: 1547499923019 webdriver::server DEBUG -> POST /session/bed7e7

使用geckodriver 0.23.0、firefox 64.0.2、selenium 3.12、java 8,我无法通过部分链接文本找到元素。没有使用框架。链接文本为“帐户(1)”。“查看所有帐户”页面上只有一个相同文本的其他实例

html:

我尝试使用“帐户””和“帐户(”,它们都返回相同的404 not found-没有这样的元素错误

控制台日志:

1547499923019   webdriver::server   DEBUG   -> POST /session/bed7e7d2-d849-4bd0-ab17-fdca3fb080f9/element {
  "value": "Accounts ",
  "using": "partial link text"
}
1547499923020   Marionette  TRACE   0 -> [0,315,"WebDriver:FindElement",{"using":"partial link text","value":"Accounts "}]
1547499923241   Marionette  TRACE   0 <- [1,315,{"error":"no such element","message":"Unable to locate element: Accounts ","stacktrace":"WebDriverError@chrome://mario ... entError@chrome://marionette/content/error.js:388:5\nelement.find/</<@chrome://marionette/content/element.js:339:16\n"},null]
1547499923240   webdriver::server   DEBUG   <- 404 Not Found {"value":{"error":"no such element","message":"Unable to locate element: Accounts ","stacktrace":"WebDriverError@chrome://marionette/content/error.js:178:5\nNoSuchElementError@chrome://marionette/content/error.js:388:5\nelement.find/</<@chrome://marionette/content/element.js:339:16\n"}}
1547499923019 webdriver::服务器调试->POST/session/bed7e7d2-d849-4bd0-ab17-fdca3fb080f9/element{
“价值”:“账户”,
“使用”:“部分链接文本”
}
1547499923020木偶跟踪0->[0315,“WebDriver:FindElement”,{“使用”:“部分链接文本”,“值”:“帐户”}]

1547499923241木偶跟踪0正如您所提到的,您正在尝试查找文本为Accounts(n)的元素其中n=1、2、3…和更多链接文本元素,如添加新帐户和查看所有帐户,而不是使用
partialLinkText
,最好使用XPath,您可以使用以下解决方案:

  • XPath:


更新
根据讨论,部分链接文本选择器优于XPath选择器。然而,根据这个用例,由于存在类似的链接文本,构建XPath会更容易。

答案不错……但是使用XPath是否比使用partialLinkText更好?@MosheSlavin对答案进行了更新。让我看看现在,如果这回答了你的反问题。我已经看到了这个讨论,因此我的答案和评论…我必须说,我从你那里学到了很多!!!感谢partialLinkText让我困惑的是无法找到唯一的名称:-添加新帐户-结尾没有s->不应该被搜索“帐户”或“帐户”捕获(“----查看新帐户-末尾没有空格->不应通过搜索“帐户”或“帐户”(----我这里缺少什么吗?@Ivana,因为您的目标文本是
帐户(n)
,目标文本部分
帐户
可能包括
帐户(1)
查看所有帐户
两者。另一方面,我强烈避免使用
帐户(
),因为
可能会导致内部混乱。因此,我建议使用xpath或cssSelector。如果查找“帐户”由于部分链接文本不起作用,出现问题。是否尝试添加等待?是否确定没有IFRAME?是否确定大小写?尝试在开发控制台中运行
$x(“//a[.='Accounts(1)'”)”)
。是否找到任何内容?
driver.findElement(By.partialLinkText("Accounts (")).click();
1547499923019   webdriver::server   DEBUG   -> POST /session/bed7e7d2-d849-4bd0-ab17-fdca3fb080f9/element {
  "value": "Accounts ",
  "using": "partial link text"
}
1547499923020   Marionette  TRACE   0 -> [0,315,"WebDriver:FindElement",{"using":"partial link text","value":"Accounts "}]
1547499923241   Marionette  TRACE   0 <- [1,315,{"error":"no such element","message":"Unable to locate element: Accounts ","stacktrace":"WebDriverError@chrome://mario ... entError@chrome://marionette/content/error.js:388:5\nelement.find/</<@chrome://marionette/content/element.js:339:16\n"},null]
1547499923240   webdriver::server   DEBUG   <- 404 Not Found {"value":{"error":"no such element","message":"Unable to locate element: Accounts ","stacktrace":"WebDriverError@chrome://marionette/content/error.js:178:5\nNoSuchElementError@chrome://marionette/content/error.js:388:5\nelement.find/</<@chrome://marionette/content/element.js:339:16\n"}}
new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//li/a[@class='first accounting_page_menu' and starts-with(@href,'/accounting/view_all_accounts?')][starts-with(.,'Accounts')]"))).click();