首页 > 解决方案 > Selenium Python:ElementNotInteractableException:对象没有大小和位置

问题描述

我的问题如下:

我试图找到一个输入字段并在其中写入。

该字段是可见的,没有滚动条,我也延迟了,等待它,除非它完全呈现。

这是代码

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
from selenium.webdriver.support.ui import Select
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
import time


username = "********"
password = "********"

url = "https://www.wikifolio.com/dynamic/de/de/login/login?ReturnUrl=/de/de/home&_=1632037782306"

driver = webdriver.Chrome(executable_path=r'\Users\Benjamin\Downloads\chromedriver_win32\chromedriver.exe')
wait = WebDriverWait(driver, 20)

driver.get(url)
driver.find_element_by_name("Username").send_keys(username)
driver.find_element_by_name("Password").send_keys(password)

driver.find_element_by_css_selector("button").click()

driver.get("https://www.wikifolio.com/de/de/meine-wikifolios/trade/wf00wiking")

wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, ".c-disclaimer .js-disclaimer__abort, .c-disclaimer .js-disclaimer__change"))).click()


wait.until(EC.visibility_of_element_located((By.XPATH, "//a[@data-description='AKER CARB.CAPT.AS NK1']"))).click()

wait.until(EC.presence_of_element_located((By.XPATH, "//div[@id='trading-modal-root' and(contains(@style,'block'))]//select[@class='js-order-type-select order-type-selector']")))
select1 = Select(driver.find_element_by_xpath("//div[@id='trading-modal-root' and(contains(@style,'block'))]//select[@class='js-order-type-select order-type-selector']"))


select1.select_by_value('quote')


#to select purchase or sale action:
select2 = Select(driver.find_element_by_xpath("//div[@id='trading-modal-root' and(contains(@style,'block'))]//select[@class='js-order-type-buysell order-buysell-selector']"))

# select by value "buy"
select2.select_by_value('buy')



sleep(3)
button = driver.find_element_by_xpath("//input[@data-container='body'][@data-original-title='Wie viele Stück möchten Sie kaufen?']")
ActionChains(driver).move_to_element(button).send_keys('33').perform()

我的问题,或者我的问题与该代码的最后一部分特别相关:

sleep(3)
button = driver.find_element_by_xpath("//input[@data-container='body'][@data-original-title='Wie viele Stück möchten Sie kaufen?']")
ActionChains(driver).move_to_element(button).send_keys('33').perform()

这是错误消息:

---------------------------------------------------------------------------
ElementNotInteractableException           Traceback (most recent call last)
<ipython-input-28-34833c86f501> in <module>
     48 sleep(3)
     49 button = driver.find_element_by_xpath("//input[@data-container='body'][@data-original-title='Wie viele Stück möchten Sie kaufen?']")
---> 50 ActionChains(driver).move_to_element(button).send_keys('33').perform()
     51 
     52 

~\anaconda3\lib\site-packages\selenium\webdriver\common\action_chains.py in perform(self)
     78         """
     79         if self._driver.w3c:
---> 80             self.w3c_actions.perform()
     81         else:
     82             for action in self._actions:

~\anaconda3\lib\site-packages\selenium\webdriver\common\actions\action_builder.py in perform(self)
     74             if encoded['actions']:
     75                 enc["actions"].append(encoded)
---> 76         self.driver.execute(Command.W3C_ACTIONS, enc)
     77 
     78     def clear_actions(self):

~\anaconda3\lib\site-packages\selenium\webdriver\remote\webdriver.py in execute(self, driver_command, params)
    319         response = self.command_executor.execute(driver_command, params)
    320         if response:
--> 321             self.error_handler.check_response(response)
    322             response['value'] = self._unwrap_value(
    323                 response.get('value', None))

~\anaconda3\lib\site-packages\selenium\webdriver\remote\errorhandler.py in check_response(self, response)
    240                 alert_text = value['alert'].get('text')
    241             raise exception_class(message, screen, stacktrace, alert_text)
--> 242         raise exception_class(message, screen, stacktrace)
    243 
    244     def _value_or_default(self, obj, key, default):

ElementNotInteractableException: Message: element not interactable: [object HTMLInputElement] has no size and location
  (Session info: chrome=93.0.4577.82)

这是相应的 HTML 部分:

<div class="col-xs-6">

<input class="js-order-amount trading-amount trading-price-field textbox pull-left" type="text" maxlength="9" required="required" placeholder="Menge" value="1" data-toggle="tooltip" data-html="true" data-trigger="manual" data-container="body" data-placement="right" title="" data-original-title="Wie viele Stück möchten Sie kaufen?">

</div>

这里可能是什么问题?到目前为止,我在这里发现的所有问题都与隐藏元素(在屏幕窗口中不是字面上“可见”)或延迟太短有关,因此该元素无法呈现。我还尝试了 20 秒的延迟,这不会改变任何事情。

编辑 我还想,也许这个东西被包装成一个 div,这就是为什么我现在提供该行的整个 html:

<div class="row">
<div class="col-xs-6">
<span class="settings-label">Stück</span>
</div>
<div class="col-xs-6">
<input class="js-order-amount trading-amount trading-price-field textbox pull-left" type="text" maxlength="9" required="required" placeholder="Menge" value="1" data-toggle="tooltip" data-html="true" data-trigger="manual" data-container="body" data-placement="right" title="" data-original-title="Wie viele Stück möchten Sie kaufen?">
</div>
</div>

那么有没有办法首先解决 div 元素并以某种方式“单击”它。

在此先感谢,本杰明

标签: pythonseleniumselenium-webdriverxpath

解决方案


要在 xpath 中有 2 个参数,您可以and在您的代码中使用您的情况,它将是

button = driver.find_element_by_xpath("//input[@data-container='body' and @data-original-title='Wie viele Stück möchten Sie kaufen?']")

推荐阅读