3 回答
TA贡献1712条经验 获得超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
浏览器快照:
TA贡献1828条经验 获得超3个赞
尝试使用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)
TA贡献1784条经验 获得超7个赞
它在<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-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')
添加回答
举报