我的问题如下:
我试图找到一个输入字段并在其中写入。
该字段是可见的,没有滚动条,我也放了一个延迟,等待,除非它完全呈现。
代码
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'UsersBenjaminDownloadschromedriver_win32chromedriver.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()
My Issue,或者我的问题特别与代码的最后一部分有关:
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
~anaconda3libsite-packagesseleniumwebdrivercommonaction_chains.py in perform(self)
78 """
79 if self._driver.w3c:
---> 80 self.w3c_actions.perform()
81 else:
82 for action in self._actions:
~anaconda3libsite-packagesseleniumwebdrivercommonactionsaction_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):
~anaconda3libsite-packagesseleniumwebdriverremotewebdriver.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))
~anaconda3libsite-packagesseleniumwebdriverremoteerrorhandler.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元素然后点击"它在某种程度上。
谢谢提前我很感激,本杰明
要在xpath中有两个参数,您可以在代码中使用and
在你的例子中,它将是
button = driver.find_element_by_xpath("//input[@data-container='body' and @data-original-title='Wie viele Stück möchten Sie kaufen?']")
正因为这件事产生了新的倾向,所以我现在用这个更新来回答我自己的问题:
我已经改变了动作链的部分,它应该执行一个"senk_keys"输入字段:
buttonnew = wait.until(EC.visibility_of_element_located((By.XPATH, "/html/body/div[3]/div[4]/div/div/div/div/div[2]/div[3]/div/div/div[2]/div[2]/input")))
newaction = ActionChains(driver)
newaction.move_to_element(buttonnew).send_keys(int(22)).perform()
使用这些新行,程序在选择下拉菜单时突然停止。
有人知道这是怎么回事吗?
感谢