如何使用 Selenium Webdriver Java 查找 table 行号
How to find the table row number using Selenium Webdriver Java
我有一个包含多行和多列的 table。
HTML 代码如下所示:
<!-- language: lang-html -->
<div id="ScheduleTable-01" class="widget Scheduletable suppress-errors Schedule-grid" data-widget="ScheduleTable">
<div class="grid-wrapper">
<table class="nostyles weekmode hourstype fullmonth" style="width: 100%;">
<thead>
<tbody>
<tr id="20631697" class="Schedule-row row0 20631697 key_AuthoriserId-1077_JobId-402704200_TaskId-CON_TsCode-35" data-row-index="0" data-job="402121200,Job XXX">
<tr id="-499545938" class="Schedule-row row1 -499545938 key_AuthoriserId-1077_JobId-A01200131S_TaskId-CON_TsCode-35" data-row-index="1" data-job="A01763431 Job YYY">
<tr id="-985929934" class="Schedule-row row2 -985929934 key_AuthoriserId-1277_JobId-I02010171S_TaskId-INT_TsCode-30" data-row-index="2" data-job="I02872371 S,Job ZZZ">
因为是动态网页,每次加载页面时,Job YYY会被放在不同的行索引中。因此,我想知道 table Job YYY 位于哪一行。
我可以看到每一行都标有data-row-index
,这就是我想要得到的。
我正在考虑这个 Selenium 代码
<!-- language: lang-java -->
WebElement mainTable = driver.findElement(By.id("ScheduleTable-01"));
//I am not sure about this part below; findElements By ???
List<WebElement> tableRows = mainTable.findElements(By.tagName("tr"));
在这种情况下,如何找到行号?谢谢。
您可以轻松使用 getAttribute()
查看 api doc。 getAtribute()
允许您获取任何 html
标签的 atribute
值
//since you know the job
String job = "A01763431 Job YYY";
String dataRowIndex = driver.findElement(By.cssSelector("[data-job='" + job + "']")).getAttribute("data-row-index");
System.out.println(dataRowIndex);
print
1
编辑
好的,可能有几件事会影响这一点。
元素在 iframe
中
如果是,则使用
driver.switchTo().frame(driver.findElement(By.cssSelector("css for iframe")));
您查找元素的速度太快了。使用显式等待。
String job = "A01763431 Job YYY";
By selector = By.cssSelector("#ScheduleTable-01 tr[data-job='" + job + "']");
WebElement element = new WebDriverWait(driver,10).until(ExpectedConditions.presenceOfElementLocated(selector));
String dataindex = element.getAttribute("data-row-index");
提供的选择器返回了多个元素
String job = "A01763431 Job YYY";
By selector = By.cssSelector("[data-job='" + job + "']");
List<WebElement> elements = new WebDriverWait(driver,10).until(ExpectedConditions.presenceOfAllElementsLocatedBy(selector));
int size = elements.size();
System.out.println(size);
查看返回了多少
我在这里试过这个,它解决了问题。
<!-- language: lang-java -->
String job = "YYY";
WebElement table = driver.findElement(By.xpath("//tr[contains(@data-job,'"+job+"')]"));
String dataRowIndex = table.getAttribute("data-row-index");
System.out.println(dataRowIndex);
基本上我只取工作 ID 的一部分(YYY 而不是全名),并在 xpath 中使用 contains()。
@Vivek @Saifur 非常感谢您的建议。
我有一个包含多行和多列的 table。
HTML 代码如下所示:
<!-- language: lang-html -->
<div id="ScheduleTable-01" class="widget Scheduletable suppress-errors Schedule-grid" data-widget="ScheduleTable">
<div class="grid-wrapper">
<table class="nostyles weekmode hourstype fullmonth" style="width: 100%;">
<thead>
<tbody>
<tr id="20631697" class="Schedule-row row0 20631697 key_AuthoriserId-1077_JobId-402704200_TaskId-CON_TsCode-35" data-row-index="0" data-job="402121200,Job XXX">
<tr id="-499545938" class="Schedule-row row1 -499545938 key_AuthoriserId-1077_JobId-A01200131S_TaskId-CON_TsCode-35" data-row-index="1" data-job="A01763431 Job YYY">
<tr id="-985929934" class="Schedule-row row2 -985929934 key_AuthoriserId-1277_JobId-I02010171S_TaskId-INT_TsCode-30" data-row-index="2" data-job="I02872371 S,Job ZZZ">
因为是动态网页,每次加载页面时,Job YYY会被放在不同的行索引中。因此,我想知道 table Job YYY 位于哪一行。
我可以看到每一行都标有data-row-index
,这就是我想要得到的。
我正在考虑这个 Selenium 代码
<!-- language: lang-java -->
WebElement mainTable = driver.findElement(By.id("ScheduleTable-01"));
//I am not sure about this part below; findElements By ???
List<WebElement> tableRows = mainTable.findElements(By.tagName("tr"));
在这种情况下,如何找到行号?谢谢。
您可以轻松使用 getAttribute()
查看 api doc。 getAtribute()
允许您获取任何 html
标签的 atribute
值
//since you know the job
String job = "A01763431 Job YYY";
String dataRowIndex = driver.findElement(By.cssSelector("[data-job='" + job + "']")).getAttribute("data-row-index");
System.out.println(dataRowIndex);
1
编辑
好的,可能有几件事会影响这一点。
元素在 iframe
中
如果是,则使用
driver.switchTo().frame(driver.findElement(By.cssSelector("css for iframe")));
您查找元素的速度太快了。使用显式等待。
String job = "A01763431 Job YYY";
By selector = By.cssSelector("#ScheduleTable-01 tr[data-job='" + job + "']");
WebElement element = new WebDriverWait(driver,10).until(ExpectedConditions.presenceOfElementLocated(selector));
String dataindex = element.getAttribute("data-row-index");
提供的选择器返回了多个元素
String job = "A01763431 Job YYY";
By selector = By.cssSelector("[data-job='" + job + "']");
List<WebElement> elements = new WebDriverWait(driver,10).until(ExpectedConditions.presenceOfAllElementsLocatedBy(selector));
int size = elements.size();
System.out.println(size);
查看返回了多少
我在这里试过这个,它解决了问题。
<!-- language: lang-java -->
String job = "YYY";
WebElement table = driver.findElement(By.xpath("//tr[contains(@data-job,'"+job+"')]"));
String dataRowIndex = table.getAttribute("data-row-index");
System.out.println(dataRowIndex);
基本上我只取工作 ID 的一部分(YYY 而不是全名),并在 xpath 中使用 contains()。
@Vivek @Saifur 非常感谢您的建议。