【问题标题】:How to click on this element using Selenium?如何使用 Selenium 单击此元素?
【发布时间】:2022-12-04 03:11:16
【问题描述】:

我必须单击一个具有多个相同元素的元素,区分方法是通过“onclick”属性,但我无法单击它。 xpath会怎样?

<button onclick="VxManager.getWidget('DirectQuoteLineItemList_inner').filterApply('4', 'DirectQuoteLineItemList_inner_COL_4');" id="Button" type="button" title="OK" class="VButton  default-true">OK</button>

我认为是这样的:

WebDriverWait(driver,20).until(EC.element_to_be_clickable((By.XPATH,'//*[@id="Button"][@title="OK"][@onclick="VxManager.getWidget('DirectQuoteLineItemList_inner').filterApply('4', 'DirectQuoteLineItemList_inner_COL_4');"]))).click()

但这不起作用,页面中还有其他标题、ID 和类。

先感谢您。

【问题讨论】:

  • 您是否尝试过从浏览器的开发人员工具中获取 XPath?
  • @MattDMo 这通常是一个非常糟糕的主意,除非您正在尝试学习 XPath。使用该工具生成的 XPath 通常又长又脆,并且不能保证它们在页面上是唯一的。
  • 您确定该 ID 在页面上不是唯一的吗?按照 HTML 标准,它应该是……但不幸的是,并不总是……
  • @JeffC 你可以看到你自己这里的 id 是Button。似乎没有独特的价值......
  • @Prophet 我看到发布的 HTML 的 ID 为“按钮”...但是由于我们没有页面的 HTML,我想知道 OP 是否已验证该 ID 在页面上不是唯一的。如果是,那么整个讨论就没有意义了。

标签: python selenium selenium-webdriver xpath css-selectors


【解决方案1】:

在看到您正在处理的页面之前,我们无法给您 100% 的正确答案,但我猜它可能是这样的:

WebDriverWait(driver,20).until(EC.element_to_be_clickable((By.XPATH,'//button[@id="Button"][@title="OK"][contains(@onclick,"DirectQuoteLineItemList_inner")]'))).click() 

我猜 DirectQuoteLineItemList_inner 部分应该是固定值。
或者,正如@JeffC 所建议的那样:

WebDriverWait(driver,20).until(EC.element_to_be_clickable((By.XPATH,'//button[@id="Button"][@title="OK"][contains(@onclick,"DirectQuoteLineItemList_inner_COL_4")]'))).click() 

【讨论】:

  • 如果您知道它是一个 BUTTON,请使用 //BUTTON 而不是 //*... 应该可以更快地找到它。
  • 我猜页面上有很多类似的确定按钮,而“DirectQuoteLineItemList_inner_COL_4”是其中最重要/最独特的部分。
  • 非常感谢您的回答!也许引号有问题?
【解决方案2】:

正如您提到的,唯一的区分方式是通过onclick您可以独占使用它的属性。

然而,由于所需元素是动态元素,因此要单击您需要为 element_to_be_clickable() 引入 WebDriverWait 的元素,您可以使用以下任一 locator strategies

  • 使用CSS_SELECTOR:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button.VButton.default-true#Button[onclick*='VxManager'][onclick*='DirectQuoteLineItemList_inner']"))).click()
    
  • 使用XPATH:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//button[contains(@onclick, 'VxManager') and contains(@onclick, 'DirectQuoteLineItemList_inner')][@class='VButton  default-true' and @id='Button']"))).click()
    
  • 笔记:您必须添加以下导入:

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

【讨论】:

  • 很高兴能为您提供帮助。
  • 你有一些视频来学习如何通过 CSS 选择器进行选择吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-12
  • 2021-03-31
  • 1970-01-01
  • 2018-07-07
  • 2020-03-08
  • 2017-11-23
相关资源
最近更新 更多