无法使用 Java 和 Selenium 通过部分 link 文本找到元素
Not able to find element by partial link text using Java and Selenium
使用 geckodriver 0.23.0、firefox 64.0.2、selenium 3.12,java 8 我无法通过部分 link 文本找到元素。不使用框架。 Link 文本是“帐户 (1)”。在页面“查看所有帐户”
上只有一个相同文本的其他实例
html:
<li>
<a href="/accounting/view_all_accounts?_t=039f18daf35b4a00f0093dd17aa70730be385f6f&to_render=account" class="first accounting_page_menu ">Accounts (1)</a>
<ul>
<li>
<a href="/accounting/details?_t=e3d4ea94f5ed862d95196a620f1147be13b02979&to_render=account" class="first accounting_page_menu ">Primary</a>
</li>
<li>
<a onclick="javascript: ModalUtil.loadEditableModal('/accounting/details_new_account', false, false, true);" class="add-accounts">Add New Account...</a>
</li>
<li>
<a href="/accounting/view_all_accounts?_t=039f18daf35b4a00f0093dd17aa70730be385f6f&to_render=account" class="first accounting_page_menu ">View All Accounts</a>
</li>
</ul>
</li>
我用来查找元素的代码:"Accounts (n)" 其中 n = 1、2、3 ...
driver.findElement(By.partialLinkText("Accounts (")).click();
我尝试使用“Accounts”和“Accounts (”,它们都return找不到相同的 404 - 没有这样的元素错误
控制台日志:
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"}}
正如您所提到的,您正在尝试查找文本为 Accounts (n) 的元素,其中 n = 1, 2, 3 ... 以及更多元素linkText as Add New Account and View All Accounts 存在,而不是使用 partialLinkText
最好用XPath 可以用下面的解决方法:
XPath:
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();
更新
根据讨论 部分 link 文本选择器 优于 XPath 选择器。但是,根据此 usecase,由于存在类似的 link 文本,构建 XPath.
使用 geckodriver 0.23.0、firefox 64.0.2、selenium 3.12,java 8 我无法通过部分 link 文本找到元素。不使用框架。 Link 文本是“帐户 (1)”。在页面“查看所有帐户”
上只有一个相同文本的其他实例html:
<li>
<a href="/accounting/view_all_accounts?_t=039f18daf35b4a00f0093dd17aa70730be385f6f&to_render=account" class="first accounting_page_menu ">Accounts (1)</a>
<ul>
<li>
<a href="/accounting/details?_t=e3d4ea94f5ed862d95196a620f1147be13b02979&to_render=account" class="first accounting_page_menu ">Primary</a>
</li>
<li>
<a onclick="javascript: ModalUtil.loadEditableModal('/accounting/details_new_account', false, false, true);" class="add-accounts">Add New Account...</a>
</li>
<li>
<a href="/accounting/view_all_accounts?_t=039f18daf35b4a00f0093dd17aa70730be385f6f&to_render=account" class="first accounting_page_menu ">View All Accounts</a>
</li>
</ul>
</li>
我用来查找元素的代码:"Accounts (n)" 其中 n = 1、2、3 ...
driver.findElement(By.partialLinkText("Accounts (")).click();
我尝试使用“Accounts”和“Accounts (”,它们都return找不到相同的 404 - 没有这样的元素错误
控制台日志:
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"}}
正如您所提到的,您正在尝试查找文本为 Accounts (n) 的元素,其中 n = 1, 2, 3 ... 以及更多元素linkText as Add New Account and View All Accounts 存在,而不是使用 partialLinkText
最好用XPath 可以用下面的解决方法:
XPath:
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();
更新
根据讨论