使用Selenium单击ember.js启用的元素

2024-04-26 23:07:17 发布

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

我正在尝试使用selenium单击linkedin页面上的以下按钮:

<button id="ember607" class="share-actions__primary-action artdeco-button artdeco-button--2 artdeco-button--primary ember-view" data-control-name="share.post"><!---->
<span class="artdeco-button__text">
    
        Post
    
</span></button>

我尝试使用:

  • driver.find_element_by_id,但按钮的id似乎一直在更改编号
  • driver.find_element_by_xpath,但它包含按钮编号,因此也会失败
  • driver.find_element_by_class_name('share-actions__primary-action artdeco-button artdeco-button--2 artdeco-button--primary ember-view'),即使类名正确,也会失败吗

基本上,所有方法都会生成相同的错误消息:

Exception has occurred: NoSuchElementException
Message: no such element: Unable to locate element:{[*the_error_is_here*]}

我还尝试了xpath contains()方法,但没有找到按钮

点击这个按钮的正确方法是什么

我正在使用python版本3.9windowsdriver = webdriver.Chrome


Tags: 方法actionsidsharebydriverbuttonaction
3条回答

有时按钮出现问题,此时无法单击。 试试这个:

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


wait = WebDriverWait(driver, 10)

button = wait.until(EC.element_to_be_clickable((By.XPATH, '[YOUR X_PATH TO THE BUTTON]')))
driver.execute_script("arguments[0].click()", button)

用selenium点击任何按钮都不是最干净的方法,但对我来说,这种方法几乎每次都有效

//button[@class="share-actions__primary-action artdeco-button artdeco-button--2 artdeco-button--primary ember-view"]. 

//button[contains(@id,'ember')]

元素是启用了Ember.js的元素。因此,要在文本为Post的元素上click(),可以使用以下Locator Strategies之一:

  • 使用css_selector

    driver.find_element_by_css_selector("button.share-actions__primary-action[data-control-name='share.post']>span.artdeco-button__text").click()
    
  • 使用xpath

    driver.find_element_by_xpath("//button[contains(@class, 'share-actions__primary-action') and @data-control-name='share.post']/span[@class='artdeco-button__text' and contains(., 'Post')]").click()
    

理想情况下,要单击需要为element_to_be_clickable()诱导WebDriverWait的元素,可以使用以下Locator Strategies之一:

  • 使用CSS_SELECTOR

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button.share-actions__primary-action[data-control-name='share.post']>span.artdeco-button__text"))).click()
    
  • 使用XPATH

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//button[contains(@class, 'share-actions__primary-action') and @data-control-name='share.post']/span[contains(., 'Post')]"))).click()
    
  • 注意:您必须添加以下导入:

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

参考资料

您可以在以下内容中找到一些相关的详细讨论:

相关问题 更多 >