有没有办法在没有唯一ID的Selenium网页上选择项目?

2024-09-30 20:34:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我的目标是打开一个网页,然后单击特定应用程序的应用程序按钮,如Anaplan。在过去,我通过CSS选择器将get元素与class和IDas shown in this past post结合使用

first_item = driver.find_element_by_id("anaplan")

我遇到过一个网页,其中的按钮似乎没有任何ID或唯一值:

enter image description here

enter image description here

Anaplan应用程序按钮的HTML输出:

<a
  aria-label="launch app Anaplan"
  class="chiclet a--no-decoration"
  data-se="app-card"
  href="https://gartner.okta.com/home/anaplan/0oaforg08lyATdLuw4x6/2487"
  draggable="true"
  ><article class="chiclet--article">
    <button
      class="chiclet--action"
      tabindex="0"
      aria-label="Settings for Anaplan"
      data-se="app-card-settings-button"
    >
      <svg
        class="chiclet--action-kebab"
        width="20"
        height="4"
        viewBox="0 0 20 4"
        fill="#B7BCC0"
        xmlns="http://www.w3.org/2000/svg"
      >
        <circle cx="2" cy="2" r="2"></circle>
        <circle cx="10" cy="2" r="2"></circle>
        <circle cx="18" cy="2" r="2"></circle>
      </svg>
    </button>
    <section class="chiclet--main" data-se="app-card-main">
      <img
        class="chiclet--main-logo"
        src="https://ok11static.oktacdn.com/fs/bcg/4/gfs1ev15ab63zqgZ91d8"
        alt="Anaplan logo"
      />
    </section>
    <footer class="chiclet--footer" data-se="app-card-footer">
      <o-tooltip content="Anaplan" position="bottom" class="hydrated"
        ><div slot="content"></div>
        <div aria-describedby="o-tooltip-0">
          <h1 class="chiclet--app-title" data-se="app-card-title">Anaplan</h1>
        </div>
      </o-tooltip>
    </footer>
  </article>
</a>

我抓取了Anaplan按钮的Xpath,它显示了以下内容:

/html[@class='hydrated wf-proximanova-n4-inactive wf-
inactive']/body[@class='default']/div[@id='root']
/div[@class='enduser-app ']/section[@class='content-frame']
/main[@class='main-container has-top-bar']/div[@class='dashboard--main']/section[@id='main- 
content']/section[@class='chiclet-area']
/section[@class='chiclet-grid--container']
/section/section[@class='chiclet-grid section-appear-done section-enter-done']
/a[@class='chiclet a--no-decoration'][1]/article[@class='chiclet--article']

应用程序之间的唯一区别在于括号中的数字: /a[@class='chiclet a--no-decoration'][1],其中1似乎是Anaplan,3是G驱动器,依此类推。有没有一种方法可以选择这样的元素,其中似乎根本没有唯一标识符


Tags: divapp应用程序datamainarticlesectioncard
2条回答

要定位第一个按钮,您可以使用以下xpaths//a[@aria-label='launch app Anaplan']//a[contains(@href,'anaplan')]中的一个,还有许多其他独特的组合。用css selectors
也可以做到这一点 与上述类似,此处提供的所有其他导航按钮也有多种组合。
如果元素位于<iframe>内,则必须首先切换到该<iframe>,然后再从中退出。

找到<iframe>iframe = driver.find_element_by_xpath("//iframe[@name='iframeName']")或与之匹配的任何定位器
然后switch_to<iframe>
driver.switch_to.frame(iframe)
如果在此之后您需要继续执行<iframe>之外的任何位置,请使用
将其切换出来 driver.switch_to.default_content()

xpath和css都可以。 {}的示例:

安纳普兰:

//a[contains(@aria-label, 'Anaplan')]/article/button

或:

//button[contains(@aria-label, 'Settings for Anaplan')]

垃圾邮件隔离:

//a[contains(@aria-label, 'Spam Quarantine')]

G套房

//a[contains(@aria-label, 'G Suite Drive')]

其主要思想是,您可以通过编写属性的部分名称来查找元素

更新:

如果某个元素位于iframe内部,则应等待加载并切换到该元素。Selenium有非常方便的方法:框到可用,切换到可用

from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait

driver = webdriver.Chrome()
driver.get(url)
wait = WebDriverWait(driver, 15)
wait.until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR, "iframe[data-testid=shell-content]")))

切换到iframe后,可以使用其中的元素

相关问题 更多 >