【问题标题】:How do I select the an element without an ID/text_link/name in selenium?如何在 selenium 中选择没有 ID/text_link/name 的元素?
【发布时间】:2021-06-21 01:10:38
【问题描述】:

HTML of the website

我要选择的元素的 HTML 代码:

   <a href="../s-reminderNotice.asp?fname=b%2D3c%2DpLessonBooking%2Easp%3Flimit%3Dpl" class="sidelinkbold" 
   target="mainFrame" 
   onmouseover=" window.status='Practical Training Booking'; 
   return true" onmouseout="window.status=' ';
   return true">Booking without Fixed Instructor</a>

我想选择这个“没有固定教练的预订”的元素;但是这个元素没有 ID/link_text/name。如何将站点定向到 HREF。有没有办法使用 xpath 来定位它,该元素位于网站左侧的列中,因此同一类的其他元素还有很多。 (见图)

我试过了,它返回了:

AttributeError: 'WebDriver' object has no attribute 'findElement'

代码:

driver.findElement(By.xpath("//a[@href='THE LINK']")).click();

已解决;元素在一个框架中;必须切换框架以访问元素

【问题讨论】:

  • 你能分享网站链接并详细阐述问题吗?我很乐意为您提供帮助
  • 您需要我的凭据才能登录网站;我无法提供。如果可能的话,我可以将你添加到 discord 并分享我的屏幕
  • 当然...你可以给链接

标签: python selenium xpath css-selectors linktext


【解决方案1】:
AttributeError: 'WebDriver' object has no attribute 'findElement'

你使用的是 python,所以驱动程序没有 findElemnt 方法,它是 find_Element

https://www.selenium.dev/selenium/docs/api/py/webdriver_remote/selenium.webdriver.remote.webdriver.html?highlight=webdriver%20class#selenium.webdriver.remote.webdriver.WebDriver.find_element_by_class_name

use:

    driver.find_element(By.XPATH("//a[contains(string(),'Booking without Fixed Instructor')]")

【讨论】:

    【解决方案2】:

    要单击文本为 Booking without Fixed Instructor 的元素,您可以使用以下任一Locator Strategies

    • 使用link_text

      driver.find_element(By.LINK_TEXT, "Booking without Fixed Instructor")
      
    • 使用partial_link_text

      driver.find_element(By.PARTIAL_LINK_TEXT, "Booking without Fixed Instructor").click()
      
    • 使用css_selector

      driver.find_element(By.CSS_SELECTOR, "a.sidelinkbold[href*='s-reminderNotice']").click()
      
    • 使用xpath

      driver.find_element(By.XPATH, "//a[@class='sidelinkbold' and contains(@href, 's-reminderNotice')][contains(., 'Booking without Fixed Instructor')]").click()
      

    想要的元素是动态元素,所以理想情况下点击该元素需要诱导WebDriverWaitelement_to_be_clickable(),可以使用以下Locator Strategies之一:

    • 使用LINK_TEXT

      WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.LINK_TEXT, "Booking without Fixed Instructor"))).click()
      
    • 使用PARTIAL_LINK_TEXT

      WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.PARTIAL_LINK_TEXT, "Booking without Fixed Instructor"))).click()
      
    • 使用CSS_SELECTOR

      WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "a.sidelinkbold[href*='s-reminderNotice']"))).click()
      
    • 使用XPATH

      WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//a[@class='sidelinkbold' and contains(@href, 's-reminderNotice')][contains(., 'Booking without Fixed Instructor')]"))).click()
      
    • 注意:您必须添加以下导入:

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

    参考文献

    您可以在NoSuchElementException 上找到一些相关讨论:

    【讨论】:

    • 这很完美,但是我已经尝试了所有方法,但仍然得到 NoSuchElementException ;我已经添加了等待缓冲区以允许网站加载?以及可能仍然发生的原因
    • 我想通了;显然它在 iframe 下,因此我必须切换框架才能访问元素
    • @gabethechef 更新了对 NoSuchElementException 的引用的答案
    【解决方案3】:

    试试这个 xpath:

    //a[text()[contains(.,'Booking without Fixed Instructor')]]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-12-20
      • 2013-04-13
      • 2019-12-22
      • 1970-01-01
      • 1970-01-01
      • 2016-01-21
      • 2017-06-07
      相关资源
      最近更新 更多