Java # Selenium: как получить все значения ячеек в таблице div Dynami c, которая не имеет tr / td и имеет только теги div? - PullRequest
0 голосов
/ 16 июня 2020

Пожалуйста, помогите мне перебрать все значения ячеек в таблице div. Столбцы таблицы являются динамическими c, поэтому они будут отображаться или нет, в зависимости от типа пользователя, вошедшего в систему.

Я могу получить значения ячеек столбца промежуточного итога и столбца имени отчета, используя ниже xpath:

//*[@id='MyExpenses']/div/div/div[count(preceding-sibling::div)+1 = 
count(ancestor::div/div[1]/div[.='Sub-Total']/preceding-sibling::div)+1]"))

//*[@id='MyExpenses']/div/div/div[count(preceding-sibling::div)+1 = 
count(ancestor::div/div[1]/div[.='                Report Name            ']/preceding-sibling::div)+1]

Однако, когда я пытаюсь сделать то же самое для любого другого столбца, например: Start Date, тогда веб-драйвер возвращает мне значения столбца Report Name. Я пытаюсь указать xpath для даты начала:

//*[@id='MyExpenses']/div/div/div[count(preceding-sibling::div)+1 = count(ancestor::div/div[1]/div[.=' Start Date            ']/preceding-sibling::div)+1]

Я также пытался получить значения ячеек по имени класса, но это также не работает для нескольких столбцов, потому что имя класса отличается для заголовка столбца и его значения ячеек, например для начальной даты имя класса: «начало» для заголовка, пока оно есть, «дата» для значений ячеек. Кроме того, значения ячеек End Date имеют один и тот же класс, т.е. 'date'. Таким образом, приведенный ниже xpath также не возвращает желаемый результат:

WebElement pendigTable = driver.findElement(By.xpath("//*[@id='MyExpenses']"));
String startDate = pendigTable.findElements(By.className("date")).getText();

Для пользователя 1:

<div style="width: 100%" class="tab pend active col-12" id="MyExpenses">                                   

<div class="title-table">

            <div class="report-name">                Report Name            </div>
            <div class="type">                Report Type            </div>
            <div class="start"> Start Date            </div>            
            <div class="end"> End Date            </div>       
            <div class="sub-total">Sub-Total</div>    
</div>
   <div class="data-table">
        <div class="report-name" data-title="Report Name :">
        <a href="/gorillapro/web/Expense/AddTransactionToReport?ExpenseId=743">T1</a>               
            </div>

                 <div class="type" data-title=" Report Type :">      CORPORATE</div>           
                 <div class="date" data-title="Start Date :">                6/1/2020            </div>
                 <div class="date" data-title="End Date :">                  6/30/2020           </div>
                 <div class="sub-total" data-title="Sub-Total :">            12.00            </div>            
            </div>        
   </div>

Для пользователя 2

<div style="width: 100%" class="tab pend active col-12" id="MyExpenses">                                   

<div class="title-table">

            <div class="report-name">                Report Name            </div>
            <div class="type">                Report Type            </div>
            <div class="sub-total">Sub-Total</div>  
            <div id="lblProjectNumber">                Job Number            </div>         
            <div class="start"> Start Date            </div>            
            <div class="end"> End Date            </div>       

</div>
   <div class="data-table">
        <div class="report-name" data-title="Report Name :">
        <a href="/gorillapro/web/Expense/AddTransactionToReport?ExpenseId=743">T1</a>               
            </div>

                 <div class="type" data-title=" Report Type :">      CORPORATE</div>   
                <div class="sub-total" data-title="Sub-Total :">            12.00            </div> 
                <div class="conf-number" data-title="Confirmation No. :">          1221                  </div>             
                 <div class="date" data-title="Start Date :">                6/1/2020            </div>
                 <div class="date" data-title="End Date :">                  6/30/2020           </div>

            </div>        
   </div>

1 Ответ

0 голосов
/ 17 июня 2020

Эти XPath отлично работают с вашими образцами данных:

//div[@id="MyExpenses"]//div[@class="report-name"]
//div[@id="MyExpenses"]//div[@class="type"]
//div[@id="MyExpenses"]//div[@class="end" or starts-with(@data-title,"End")]
//div[@id="MyExpenses"]//div[@class="start" or starts-with(@data-title,"Start")]
//div[@id="MyExpenses"]//div[@class="sub-total"][1]

Примечание: [1] в конце последнего выражения, поскольку существует другой div с тем же классом ('Total Reimbursable') . Замените [1] на [2], чтобы получить его.

...