如何通过 Selenium 从 table 之类的对象中获取文本? (但实际上不是 table)

How to get text from table like object via Selenium? (but not actually a table)

鉴于 Power BI web 中的以下“table”:

table like object in Power BI Web with lists of Users and their emails

我需要 Selenium 逐行提取个人的电子邮件和姓名。 Table 行可能不同。

我已经设法得到 1 个电子邮件值,如下所示:

element = driver.find_element_by_xpath("//*[@id='artifactContentList']/div[1]/div[3]/div[2]/span")
element.text

但是,这与特定行相关联。其他行如下:

//*[@id="artifactContentList"]/div[1]/div[2]/div[2]/span
//*[@id="artifactContentList"]/div[1]/div[3]/div[2]/span
//*[@id="artifactContentList"]/div[1]/div[4]/div[2]/span

这是“table”的 HTML(仅包括第 1 行)

<cdk-virtual-scroll-viewport _ngcontent-thn-c40="" class="cdk-virtual-scroll-viewport cdk-virtual-scroll-orientation-vertical ng-star-inserted" id="artifactContentList" itemsize="50" maxbufferpx="400" minbufferpx="400">
<div class="cdk-virtual-scroll-content-wrapper" style="transform: translateY(0px);">
<!----><!----><!---->
<div _ngcontent-thn-c40="" cdkmonitorsubtreefocus="" class="row ng-star-inserted" role="row">
   <!----><!----><!----><!---->
   <div _ngcontent-thn-c40="" class="fluent-cell ng-star-inserted" role="cell">
      <!---->
      <user-details-host _ngcontent-thn-c41="" cdkmonitorelementfocus="" class="col col-creator ng-star-inserted" role="cell" style="width: 432px;">
         <user-details _nghost-thn-c50="">
            <!---->
            <div _ngcontent-thn-c50="" class="user-image ng-star-inserted">
               <!----><!---->
               <div _ngcontent-thn-c50="" class="user-icon-circle ng-star-inserted" style="width: 24px; height: 24px;">
                  <!---->
                  <div _ngcontent-thn-c50="" class="ng-star-inserted" style="font-size: 10.08px;">GE</div>
                  <!---->
               </div>
            </div>
            <!---->
            <div _ngcontent-thn-c50="" class="user-info ng-star-inserted">
               <!---->
               <div _ngcontent-thn-c50="" class="user-name ng-star-inserted">Dashboard Name Here</div>
               <!---->
            </div>
         </user-details>
      </user-details-host>
   </div>
   <!----><!----><!---->
   <div _ngcontent-thn-c40="" class="fluent-cell ng-star-inserted" role="cell">
      <!----><span _ngcontent-thn-c41="" cdkmonitorelementfocus="" class="col col-emailAddress ng-star-inserted" role="cell" title="email@onmicrosoft.com" style="width: 385px;">email@onmicrosoft.com</span>
   </div>
   <!----><!----><!---->
   <div _ngcontent-thn-c40="" class="fluent-cell ng-star-inserted" role="cell">
      <!----><span _ngcontent-thn-c41="" cdkmonitorelementfocus="" class="col col-permissions ng-star-inserted" role="cell" title="Member (Owner)" style="width: 132px;">Member (Owner)</span>
   </div>
   <!----><!----><!---->
   <div _ngcontent-thn-c40="" class="fluent-cell ng-star-inserted" role="cell">
      <!---->
      <update-permissions-context-menu _ngcontent-thn-c39="" class="context-menu ng-star-inserted" menuicon="pbi-glyph-more">
         <!---->
         <mat-menu class="">
            <!---->
         </mat-menu>
      </update-permissions-context-menu>
   </div>
   <!---->
</div>
<!----><!----><!---->
<div _ngcontent-thn-c40="" cdkmonitorsubtreefocus="" class="row ng-star-inserted" role="row">
<!----><!----><!----><!---->
<div _ngcontent-thn-c40="" class="fluent-cell ng-star-inserted" role="cell">
   <!---->
   <user-details-host _ngcontent-thn-c41="" cdkmonitorelementfocus="" class="col col-creator ng-star-inserted" role="cell" style="width: 432px;">
      <user-details _nghost-thn-c50="">
         <!---->
         <div _ngcontent-thn-c50="" class="user-image ng-star-inserted">
            <!----><img _ngcontent-thn-c50="" alt="User profile image" src="blob:https://app.powerbi.com/f999999-9999-999-9a99-b977b9b59886" class="ng-star-inserted" style="width: 24px; height: 24px;"><!---->
         </div>
         <!---->
         <div _ngcontent-thn-c50="" class="user-info ng-star-inserted">
            <!---->
            <div _ngcontent-thn-c50="" class="user-name ng-star-inserted">John Doe</div>
            <!---->
         </div>
      </user-details>
   </user-details-host>
</div>
<!----><!----><!---->
<div _ngcontent-thn-c40="" class="fluent-cell ng-star-inserted" role="cell">
<!----><span _ngcontent-thn-c41="" cdkmonitorelementfocus="" class="col col-emailAddress ng-star-inserted" role="cell" title="jdoe@onmicrosoft.com" style="width: 385px;">jdoe@onmicrosoft.com</span>

谢谢!

您需要对多个网络元素使用 find_elements

如果您查看您拥有的 xpath 模式:

//*[@id="artifactContentList"]/div[1]/div[2]/div[2]/span
//*[@id="artifactContentList"]/div[1]/div[3]/div[2]/span
//*[@id="artifactContentList"]/div[1]/div[4]/div[2]/span

你会在这里看到一个序列。

div[2] 然后 div[3]div[4]

现在你可以做的是执行 xpath 索引:

div[{count}]

示例代码:

counter = 1
for element in driver.find_elements_by_xpath(f"//[@id='artifactContentList']/div[1]/div[{counter}]/div[2]/span"):
    print(element.text)
    counter = counter  + 1