Как ограничить метод findElements определенным разделом веб-страницы - PullRequest
0 голосов
/ 02 апреля 2019

Пожалуйста, перейдите по ссылке: https://www.cricbuzz.com/live-cricket-scorecard/22408/kxip-vs-dc-13th-match-indian-premier-league-2019

Здесь я хочу напечатать пробеги, забитые отдельным игроком из таблицы "Delhi Capitals Innings". Я хочу ограничить область видимости таблицей, а затем использовать метод findElemets, чтобы получить желаемый результат. Я использую код ниже.

Если заменить

System.out.println(table.findElements(By.xpath("//div[@class='cb-col cb-col-8 text-right text-bold']")).get(i).getText());

с

System.out.println(table.findElements(By.xpath("//div[@id='innings_2']//div[@class='cb-col cb-col-100 cb-ltst-wgt-hdr'] //div[@class='cb-col cb-col-8 text-right text-bold']")).get(i).getText());

получит правильный результат. Но я хочу сделать это, ограничив область действия драйвера.

public class Runs{
    public static void main(String[] args) {
        // TODO Auto-generated method stub

        System.setProperty("webdriver.chrome.driver","C:\\ChromeDriver\\1\\chromedriver.exe");

        WebDriver driver = new ChromeDriver();
        driver.get("https://www.cricbuzz.com/live-cricket-scorecard/22408/kxip-vs-dc-13th-match-indian-premier-league-2019");
        driver.manage().window().maximize();

        WebElement table = driver.findElement(By.xpath("//div[@id='innings_2']//div[@class='cb-col cb-col-100 cb-ltst-wgt-hdr']"));

        int rowCount = table.findElements(By.xpath("//div[@class='cb-col cb-col-8 text-right text-bold']")).size();
        for(int i=0;i<rowCount;i++) {
            System.out.println(table.findElements(By.xpath("//div[@class='cb-col cb-col-8 text-right text-bold']")).get(i).getText());
        }
    }
}

Я получаю ниже вывод:

R
15
20
6
39
43
29
1
3
1
0
0
2
3
0
2
0
0
R
0
30
28
39
38
0
2
0
0
4
0
2
4
2
1
0
0

Печатает все элементы, соответствующие указанному xpath, на всей веб-странице. На нем должен быть напечатан только один подарок под столом «Delhi Capitals Innings». Чего мне не хватает в этом?

Ответы [ 3 ]

0 голосов
/ 02 апреля 2019

Вы используете 2 таблицы с селектором. Если вы хотите выбрать только первое использование ниже, [1] добавьте в конец:

WebElement table = driver.findElement(By.xpath("//div[@id='innings_2']//div[@class='cb-col cb-col-100 cb-ltst-wgt-hdr'][1]"));

Вы можете получить таблицы по меткам, ниже получить строки для таблицы "Delhi Capitals Innings":

//span[.='Delhi Capitals Innings']/ancestor::div[contains(@class,'cb-ltst-wgt-hdr')]/div[.//a[@class='cb-text-link']]

Код:

String tableName = "Delhi Capitals Innings";
List<WebElement> rows = driver.findElement(By.xpath("//span[.='" 
+ tableName + "']/ancestor::div[contains(@class,'cb-ltst-wgt-hdr')]/div[.//a[@class='cb-text-link']]"));
0 голосов
/ 02 апреля 2019

Вы на правильном пути, но есть проблема.Как правило, то, что вы пытаетесь сделать, выполнимо.Часть, которую вам не хватает, находится во втором XPath.Простой пример HTML TABLE.

<table>
    <tr>
        <td></td>
        <td></td>
    </tr>
</table>

Чтобы найти TABLE с помощью XPath, вы должны использовать //table.Чтобы найти ячейку в таблице, используя второй локатор, вам нужно добавить . в начало XPath, например, ./tr/td.Это говорит XPath начать с относительной позиции.Для получения дополнительной информации см. этот вопрос .Код будет что-то вроде

WebElement table = driver.findElement(By.xpath("//table"));
WebElement cell = table.findElement(By.xpath("./tr/td"));
                  ^ I'm starting with the table variable here, like you did
                                              ^ but I added the . to indicate relative

Сказав все это, он не будет работать здесь.Нет единого HTML-элемента, который охватывал бы весь контент «Delhi Capitals Innings».На самом деле внутри родительского элемента DIV находятся 4 DIV, которые содержат весь контент.

<div id="innings_2" class="ng-scope">
    <div class="cb-col cb-col-100 cb-ltst-wgt-hdr"></div>
    <div class="cb-col cb-col-100 cb-scrd-sub-hdr cb-bg-gray text-bold">Fall of Wickets</div>
    <div class="cb-col cb-col-100 cb-col-rt cb-font-13">...</div>
    <div class="cb-col cb-col-100 cb-ltst-wgt-hdr"></div>
</div>

Вам придется очищать каждый из них по отдельности.

0 голосов
/ 02 апреля 2019

Измените метод findelements на findelement в цикле for.

System.out.println(table.findElement(By.xpath("//div[@class='cb-col cb-col-8 text-right text-bold']")).get(i).getText());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...