Selenium Web 驱动程序 - 如何处理动态 Table 和单击特定元素
Selenium Web driver- How to Handle the Dynamics Table and Click Specific Element
我是 Selenium webdriver 的新手,正在学习 Dynamics table,因为我卡在了这一点上。我想在动态中单击特定的公司名称 table 我已经为它编写了示例脚本请告诉我它有什么问题。
- 我正在使用 icicidirect 网站。
- 从主菜单栏中选择市场 link
- 现在在页面底部是一个 link "Daily Share Prices" link(它在 "Top Losers" 部分下面可以使用 ctrl+f 获取)
- 第一列的每日股价(证券名称)i.e.ABB link 元素是他们的
我想点击那个元素
public static void main(String[] args) throws Exception {
WebDriver driver = new FirefoxDriver();
driver.manage().window().maximize();
driver.get("http://www.icicidirect.com");
Thread.sleep(1000);
driver.findElement(By.xpath("//a[contains(text(),'Markets')]")).click();
Thread.sleep(3000);
driver.findElement(By.xpath("//a[contains(text(),'Daily Share Prices')]")).click();
Thread.sleep(3000);
TablePageObject tablePageObject = PageFactory.initElements(driver, TablePageObject.class);
tablePageObject.clickLink("ABB");
}
}
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 SecurityName) {
for (WebElement row: allTableRows) {
List < WebElement > links = row.findElements(By.linkText("ABB"));
// the first link by row is the company name, the second is link to be clicked
if (links.get(0).getText().contains(SecurityName)) {
links.get(0).click();
}
}
}
}
几点建议:
您可以使用以下link直接接收所需的table
driver.get("http://content.icicidirect.com/newsiteContent/Market/MarketStats.asp?stats=DailySharePrices");
您可以等待 table 加载
然后您将找到该元素并单击它(就像在您的代码中一样)。
这是适合我的代码
WebDriver driver = new FirefoxDriver();
try{
driver.get("http://content.icicidirect.com/newsiteContent/Market/MarketStats.asp?stats=DailySharePrices");
(new WebDriverWait(driver, 10/*sec*/)).until(ExpectedConditions.presenceOfElementLocated(By.linkText("ABB")));
List<WebElement> dailyList = driver.findElements(By.linkText("ABB"));
if (dailyList.size()!=0) {
dailyList.get(0).click();
}
}
catch (Exception e) {
e.printStackTrace();
}
finally{
driver.close();
}
- 如果您需要找到一些不在第一页上的元素,您可以扩展此解决方案以单击下一步>> link 并返回此循环通过删除硬编码 "ABB"元素。
我是 Selenium webdriver 的新手,正在学习 Dynamics table,因为我卡在了这一点上。我想在动态中单击特定的公司名称 table 我已经为它编写了示例脚本请告诉我它有什么问题。
- 我正在使用 icicidirect 网站。
- 从主菜单栏中选择市场 link
- 现在在页面底部是一个 link "Daily Share Prices" link(它在 "Top Losers" 部分下面可以使用 ctrl+f 获取)
- 第一列的每日股价(证券名称)i.e.ABB link 元素是他们的 我想点击那个元素
public static void main(String[] args) throws Exception {
WebDriver driver = new FirefoxDriver();
driver.manage().window().maximize();
driver.get("http://www.icicidirect.com");
Thread.sleep(1000);
driver.findElement(By.xpath("//a[contains(text(),'Markets')]")).click();
Thread.sleep(3000);
driver.findElement(By.xpath("//a[contains(text(),'Daily Share Prices')]")).click();
Thread.sleep(3000);
TablePageObject tablePageObject = PageFactory.initElements(driver, TablePageObject.class);
tablePageObject.clickLink("ABB");
}
}
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 SecurityName) {
for (WebElement row: allTableRows) {
List < WebElement > links = row.findElements(By.linkText("ABB"));
// the first link by row is the company name, the second is link to be clicked
if (links.get(0).getText().contains(SecurityName)) {
links.get(0).click();
}
}
}
}
几点建议:
您可以使用以下link直接接收所需的table
driver.get("http://content.icicidirect.com/newsiteContent/Market/MarketStats.asp?stats=DailySharePrices");
您可以等待 table 加载
然后您将找到该元素并单击它(就像在您的代码中一样)。
这是适合我的代码
WebDriver driver = new FirefoxDriver();
try{
driver.get("http://content.icicidirect.com/newsiteContent/Market/MarketStats.asp?stats=DailySharePrices");
(new WebDriverWait(driver, 10/*sec*/)).until(ExpectedConditions.presenceOfElementLocated(By.linkText("ABB")));
List<WebElement> dailyList = driver.findElements(By.linkText("ABB"));
if (dailyList.size()!=0) {
dailyList.get(0).click();
}
}
catch (Exception e) {
e.printStackTrace();
}
finally{
driver.close();
}
- 如果您需要找到一些不在第一页上的元素,您可以扩展此解决方案以单击下一步>> link 并返回此循环通过删除硬编码 "ABB"元素。