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

x33g5p2x  于 2022-11-23  发布在  其他
关注(0)|答案(5)|浏览(116)

我正在尝试使用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()方法,但是没有找到按钮。
请按一下这个按钮的正确方法是什麽?
我在windows上使用的是python版本3.9driver = webdriver.Chrome

5tmbdcev

5tmbdcev1#

该元素是启用了Ember.js的元素。因此,要对文本为Post的元素执行click(),可以使用以下定位器策略之一:

  • 使用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()

理想情况下,要单击元素,您需要引发WebDriverWait for element_to_be_clickable(),您可以使用以下任一定位器策略:

  • 使用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

参考

您可以在以下位置找到相关的详细讨论:

  • Selenium -基于ember寻找元素
  • 在运行时更改对象属性时使用Selenium自动化Ember.js应用程序
  • Ember:使用Selenium在浏览器中进行集成测试的最佳实践
  • Ember下拉式 selenium xpath
hjzp0vay

hjzp0vay2#

有时候,按钮会出现问题,此时无法单击。请尝试以下操作:

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 ,但对我来说,这种方法的作品大多每一次。

lx0bsm1f

lx0bsm1f3#

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

或者

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

fzwojiic4#

使用Post找到span并单击其按钮标记。

//span[contains(text(), 'Post')]/parent::button
mfpqipee

mfpqipee5#

通过xpath,这应该可以工作:

//button/span[contains(text(), "Post")]

把它与等待元素结合起来:

button = WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.XPATH, "//button/span[contains(text(), "Post")]"))
    )

你的按类选择器的问题是多个类名。看这个问题:How to get elements with multiple classes,了解如何解决此问题的详细信息。

相关问题