消息:没有这样的元素:无法找到元素 Selenium Python

问题描述 投票:0回答:4

我尝试单击按钮但收到此错误消息: 我尝试单击的元素确实存在于页面上,但我不确定为什么它说该元素不存在:

Message: no such element: Unable to locate element: {"method":"xpath","selector":"//button[@class="vote_button mfp-voteText"]"}

下面是我的代码:

driver.get('https://trupanion.com/canada/members/contest?pixlee_album_photo_id=427049511')

time.sleep(10)

try:
    vote = driver.find_element_by_xpath('//button[@class="vote_button mfp-voteText"]')
    vote.click()
except Exception as e:
    print(e)

下面是chrome开发工具中的XPath,显示它是正确的:

enter image description here

python selenium selenium-webdriver iframe webdriverwait
4个回答
3
投票

所需的元素位于

<iframe>
内,因此您必须:

  • 诱导 WebDriverWait 使所需的 框架可用并切换到它

  • 诱导 WebDriverWait 使所需的元素可点击

  • 您可以使用以下任一定位器策略

  • 使用

    CSS_SELECTOR

    driver.get('https://trupanion.com/members/contest?pixlee_album_photo_id=427049511')
    WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,"iframe#pixlee_lightbox_iframe")))
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button.vote_button.mfp-voteText"))).send_keys("test")
    
  • 使用

    XPATH

    driver.get("https://trupanion.com/members/contest?pixlee_album_photo_id=427049511")
    WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//iframe[@id='pixlee_lightbox_iframe']")))
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//button[@class='vote_button mfp-voteText']"))).click()
    
  • 注意:您必须添加以下导入:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    
  • 浏览器快照:

VOTED


参考

您可以在以下位置找到一些相关讨论:


1
投票

尝试在

css selector
函数中使用
XPATH
而不是
WebdriverWait()
。它将等待 X 秒以使元素可单击,并在该元素出现后立即单击它。但是,您需要切换到必须通过
frame
选择器找到的框架。

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

self.webdriver.switch_to_frame(self.webdriver.find_element_by_css_selector('frame'))
try:
    WebDriverWait(webdriver,time).until(EC.element_to_be_clickable((By.CSS_SELECTOR,path)))
except Exception as e:
   print(e)

1
投票

它在

<frame>
标签内,先切换它:

driver.get('https://trupanion.com/canada/members/contest?pixlee_album_photo_id=427049511')

time.sleep(10)

try:
    #switch it first
    driver.switch_to.frame(driver.find_element_by_id('pixlee_lightbox_iframe'))
    vote = driver.find_element_by_xpath('//button[@class="vote_button mfp-voteText"]')
    vote.click()
except Exception as e:
    print(e)

但请注意

time.sleep(..)
是个坏主意。

你可以在这里学习selenium等:

selenium-python.readthedocs.io/waits.html

切换框架:

.frame_to_be_available_and_switch_to_it

虽然你的 xpath 可以工作,但 css 选择器看起来更好:

vote = driver.find_element_by_css_selector('button.vote_button.mfp-voteText')

0
投票

我只使用了 CSS 选择器,即使它不起作用

© www.soinside.com 2019 - 2024. All rights reserved.