元素无法交互 selenium

6

我正在尝试在耐克网店结账,但我已经尝试了一切并进行了搜索,但仍找不到答案。

https://www.nike.com/nl/nl/checkout/tunnel

我已经做了以下工作:

driver.find_element_by_xpath('//button[@id="qa-guest-checkout-mobile"]').click()

<button id="qa-guest-checkout-mobile" aria-label="Guest Checkout" 
class="ncss-btn-accent u-rounded u-full-width ncss-brand u-uppercase pt3-sm pt2-lg pr5-sm pb3-sm pb2-lg pl5-sm fs14-sm d-lg-h">
<span class="d-sm-ib va-sm-m mr1-sm">Afrekenen als bezoeker</span></button>

我曾尝试使用“按ID查找”、“CSS”等方法,但都不起作用。我在这里做错了什么?当我打印元素时,只会得到一个元素,并且没有报错。

  File "C:\Users\X\OneDrive\Desktop\SN\NA.py", line 23, in <module>
    test = driver.find_element_by_xpath('//button[@id="qa-guest-checkout-mobile"]').click()
  File "C:\Users\X\AppData\Local\Programs\Python\Python37-32\lib\site-packages\selenium\webdriver\remote\webelement.py", line 80, in click
    self._execute(Command.CLICK_ELEMENT)
  File "C:\Users\X\AppData\Local\Programs\Python\Python37-32\lib\site-packages\selenium\webdriver\remote\webelement.py", line 633, in _execute
    return self._parent.execute(command, params)
  File "C:\Users\X\AppData\Local\Programs\Python\Python37-32\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "C:\Users\X\AppData\Local\Programs\Python\Python37-32\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.ElementNotVisibleException: Message: element not interactable
  (Session info: chrome=74.0.3729.131)
  (Driver info: chromedriver=74.0.3729.6 (255758eccf3d244491b8a1317aa76e1ce10d57e9-refs/branch-heads/3729@{#29}),platform=Windows NT 10.0.17134 x86_64)
1个回答

14

经过一番搜索,我找到了这篇帖子,其中有这个答案,然后我成功地编写了以下代码:

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

browser = webdriver.Chrome()
browser.get('https://www.nike.com/nl/nl/checkout/tunnel')
element = WebDriverWait(browser, 20).until(EC.presence_of_element_located((By.XPATH, "//div/button[@id='qa-guest-checkout-mobile']")))
browser.execute_script("arguments[0].click();", element)

成功点击按钮,但由于某种原因,您需要使用JavaScript强制点击该按钮...


1
这是因为该元素无法被真实用户交互,Selenium 是为了模拟真实用户浏览网站而设计的,但 JavaScript 会忽略 Selenium 所做的可见、可交互、可点击等断言,并直接调用该元素的点击事件。 - Valga
@Valga 是的,我了解Selenium的机制,但是记下来是个好主意!我尝试了等待条件,直到它可见,但超时了(20秒等待时间)。我也似乎找不到任何可以在HTML中覆盖它的东西...对我来说,唯一的解决方案似乎是在定位到“其他”元素下面后强制单击它,但如果您知道另一个解决方案,我很想看看您发布它并通知我查看! - Reedinationer
@Reedinationer,谢谢伙计。这对我有用,但你能否解释一下它是如何工作的? - Number70
1
@Number70我建议您查看这篇帖子,其中解释了使用.click()进行单击与使用JavaScript进行单击的区别,就像本答案所使用的那样。希望能有所帮助! - Reedinationer
@Reedinationer,谢谢,我会检查一下。 - Number70
有人可以帮我用JS而不是Python来做同样的事吗?我不知道要导入什么和如何使用它! - Don Diego

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接