Selenium无法找到元素,因此无法单击按钮

时间:2020-08-20 09:55:42

标签: python selenium selenium-webdriver selenium-chromedriver python-3.8

我试图使我的脚本单击Spotify Checkout Page上的“购买/购买家庭”按钮。无论是什么类,CSS,XPath,ID或我输入的任何内容,都只是说它找不到对象。

这是按钮。它不在iframe中:

<div class="sc-fzXfOu cvoJMt">
    <button id="checkout_submit" class="Button-oyfj48-0 kaOWUo sc-fzXfOv tSdMK">
        Buy Premium Family
    </button>
</div>

我的代码:

time.sleep(3)
buy = driver.find_element_by_xpath("/html/body/div[3]/div/div/div/div/div/div/div[3]/div/div/div[2]/form/div[2]/button").click()

2 个答案:

答案 0 :(得分:0)

我可以通过其他xpath单击按钮 driver.findElement(By.xpath(“ // button [@ id ='checkout_submit']”)))。click();

编辑- 仅当我最初加载页面并且dom中没有任何更改时,您的xpath才对我有用-/html/body/div[3]/div/div/div/div/div/div/div[3]/div/div/div[2]/form/div[2]/button 当显示一些新事件或错误并且dom结构发生更改时,此功能将无效。

当元素具有可区分的属性时,为什么要使用这种相对的XPath?

答案 1 :(得分:0)

这里的问题是表格不是静态的,您必须等待所有元素的加载。

页面会加载窗格以接受可以掩盖要对其执行操作的元素的cookie。

在这种情况下,最好的方法是先接受Cookie,然后执行所需的所有操作。

请尝试使此代码适应您的需求,并在我的测试中成功运行。

如果您运行此代码,则当驱动程序获取页面时,必须先停止执行才能登录。

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.remote.webelement import WebElement

# change this line
path_driver = "your_path_to_chrome_driver"

by, buy_selector, cookies_selector = By.CSS_SELECTOR, 'button#checkout_submit', "button#onetrust-accept-btn-handler"

driver = webdriver.Chrome(path_driver)
driver.maximize_window()
actions = ActionChains(driver)
driver.get("https://www.spotify.com/us/purchase/offer/premium-family/?country=US")


# wait for loading buy button
sls = wait.until(EC.presence_of_all_elements_located((by, buy_selector)))
if sls:
    # get accept cookies button element and click
    cookies_accept = driver.find_element_by_css_selector(cookies_selector)
    if isinstance(cookies_accept, WebElement):
        cookies_accept.click()
        
    # get buy button element, move to element and click
    buy = driver.find_element_by_css_selector(buy_selector)
    if isinstance(buy, WebElement) and buy.is_displayed() and buy.is_enabled():
        actions.move_to_element(buy).click(buy).perform()