Selenium:正确的定位器但不能与元素交互(输入字段) [英] Selenium: Correct locator but cannot interact with the element (input-field)

查看:27
本文介绍了Selenium:正确的定位器但不能与元素交互(输入字段)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我尝试使用以下脚本与输入字段交互:

<代码>从硒导入网络驱动程序from selenium.webdriver.common.by import By从 selenium.webdriver.support.ui 导入 WebDriverWait从 selenium.webdriver.support 导入 expected_conditions 作为 EC从 selenium.webdriver.support.ui 导入选择从 selenium.common.exceptions 导入 NoSuchElementException从 selenium.webdriver.common.keys 导入密钥从 selenium.webdriver.common.action_chains 导入 ActionChains从时间导入睡眠用户名 = ****"密码 = ****"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')等待 = WebDriverWait(驱动程序,20)driver.get(url)driver.find_element_by_name("用户名").send_keys(用户名)driver.find_element_by_name("密码").send_keys(密码)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')#选择购买或销售操作: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']"))# 按值选择购买"select2.select_by_value('购买')buttonnew = wait.until(EC.presence_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]/输入")))newaction = ActionChains(驱动程序)newaction.move_to_element(buttonnew).send_keys(int(22)).perform()

除非涉及到最后一部分,否则脚本执行正确:

buttonnew = wait.until(EC.presence_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(驱动程序)newaction.move_to_element(buttonnew).send_keys(int(22)).perform()

这里执行停止.

我用浏览器检查了 XPATH.它是独一无二的.我通过检查"检查了 Chrome然后按 >CRTL + F<

这是一个屏幕截图,Chrome 确实找到了定位器,而且它似乎是独一无二的:

这似乎表明 XPATH 是正确的,这不是找到"的问题正确的 XPATH 而是代码执行或错误编程的问题.

我还想知道,输入字段是否包含在 Shadow DOM 或任何其他形式的隐藏结构中.

但如果是这样,为什么在前面的步骤中可以选择所有其他字段(例如从下拉列表中选择)?

为了让您检查是否正确,我将提供该面板的完整 html(因为它是在该页面内打开的窗口):

<div id="trade-dialog-container"><div id="trading-modal-root";角色=对话"class =模式淡入淡出发布交易模式根";tabindex="-1";样式=显示:块;padding-right: 17px;"><div class="modal-dialog"><div class="modal-content"><div class="authorization-request-panel";样式=显示:无;"><div class="spinner-modal-wrapper"><div class="spinner"></div>

<div class="trading-panel clearfix";样式="><div class="trading-panel-close modal-close-button";数据关闭=模态"><i class="icon-close4"></i>

<div class="col-xs-12 col-sm-6 col-sm-push-6 col-md-push-6 col-lg-push-6 trading-panel-preview-col trade-panel-col";><div class="trading-panel-preview"><div class="trading-panel-preview-wrapper"><div id="trade-main-modal-header";class=交易面板标题"><h4 class="trade-popup-title-shortdesc">AKER CARB.CAPT.AS NK1</h4><span class="trade-popup-title-sub"><span id="js-underlying-isin";数据发布者=1900">NO0010890304 (L&amp;S Kurse)</span></span>

<div class="row trading-panel-price-container"><div class="col-xs-6 trading-panel-price-wrapper"><div class="trading-panel-price"><div class="currentBid text-center">2,392<small>EUR</small></div><span class="trading-panel-price-sub">Verkaufskurs (Bid)</span>

<div class="col-xs-6 trading-panel-price-wrapper"><div class="trading-panel-price"><div class="currentAsk text-center">2,423<small>EUR</small></div><span class="trading-panel-price-sub">Kaufkurs (Ask)</span>

<div class="trading-panel-summary"><table class="trading-summary-panel"><tr class="js-switch-nobuysell-row";样式=显示:无;"><td colspan=2">Bestand (aktuell)</td><td class="text-bold text-right"><span class="js-amount-underlying">14.477</span>&nbsp;Stk.</td></tr><tr style="";class="js-switch-buysell-row"><td>Bestand</td><td class="text-right trading-prev-value"><span class="js-amount-underlying">14.477</span>&nbsp;Stk.<i class="icon-right"></i></td><td class="text-bold text-right js-hideable-cell";样式=可见性:可见;"><span class="js-trade-amount-sum">14.478</span>&nbsp;Stk.</td></tr><tr class="js-switch-nobuysell-row";样式=显示:无;"><td colspan=2">现金(aktuell)</td><td class="text-bold text-right"><跨度数据值=264258.715";class=trade-popup-wikifolio-cash">264.258,715</span></td></tr><tr style="";class="js-switch-buysell-row"><td>现金</td><td class="text-right trading-prev-value"><跨度数据值=264258.715";class=trade-popup-wikifolio-cash">264.258,715</span><i class="icon-right"></i></td><td class="text-bold text-right js-hideable-cell";样式=可见性:可见;"><跨度数据值=264258.715";class="trade-popup-cash-after-trade";数据现金=264256.292">264.256,292</span>*</td></tr><tr><td colspan=2">Orderwert</td><td class="text-bold text-right js-hideable-cell";样式=可见性:可见;"><span class="js-order-value">2,423</span><span class="js-order-value-hidden"style="display: none;">&nbsp;*</span></td></tr></tbody>

<div类="row Trading-panel-notice hidden-xs"><div class="col-sm-6">Alle Preise 欧元

<div class="col-sm-6 text-right">* abhängig vom Ausführungspreis

<div class="trading-panel-message-container hidden-xs"><ul class="list-unstyled"></ul>

<div class="col-xs-12 col-sm-6 col-sm-pull-6 col-md-pull-6 col-lg-pull-6 trading-panel-detail-col trade-panel-col";><div class="trading-panel-settings"><div class="trading-panel-settings-wrapper"><div class="row u-mb-3"><div class="col-xs-6"><div class="dropdown bootstrap-select js-order-type-select order-type-selector bs3";style="width: 100%;"><option selected="selected">Bitte wählen...</option><option value=buy">Kauf</option><option value=sell">Verkauf</option></select><button type="button";tabindex="-1";class =btn dropdown-toggle btn-default"数据切换=下拉"角色=组合框"aria-owns="bs-select-4";aria-haspopup="列表框";aria-expanded="false";title=Kauf"><div class="filter-option"><div class="filter-option-inner"><div class="filter-option-inner-inner";>考夫</div></div></div><span class="bs-caret"><svg xmlns="http://www.w3.org/2000/svg";宽度=8"高度=5"viewBox=0 0 8 5"><折线填充=无"中风=#BBC4C7"笔画宽度=1.5"点数=2.5 -.5 5.5 2.5 2.5 5.5"变换=旋转(90 4 2.5)"></polyline></svg></span></button><div class=下拉菜单打开"样式=最大高度:592px;溢出:隐藏;min-height: 0px;"><div class="inner open";角色=列表框"id=bs-select-4"tabindex="-1";aria-activedescendant=bs-select-4-1"样式=最大高度:592px;溢出-y:自动;min-height: 0px;"><ul class="dropdown-menuinner";角色=演示"style="margin-top: 0px;margin-bottom: 0px;"><li><a role="option";类=下拉项目"id=bs-select-4-0"tabindex=0"><span class=text">Bitte wählen...</span></a></li><li class=selected active">;<a角色=选项";类=已选择的下拉项活动";id=bs-select-4-1"tabindex=0";aria-setsize=3"aria-posinset=2"aria-selected="true">Kauf

  • <div class="row"><div class="col-xs-6"><span class="settings-label">Stück</span>

    <div class="col-xs-6"><input class="js-order-amount trading-amount trading-price-field textbox pull-left";类型=文本"最大长度=9"必需=必需"占位符=梦哥"值=1"数据切换=工具提示";数据-html =真"数据触发器=手册";数据容器=正文"数据放置=正确"标题="data-original-title=Wie viele Stück möchten Sie kaufen?">

    <div class="row js-stop-order-row";样式=显示:无"><div class="col-xs-6"><span class="settings-label"><span class="trade-popup-stop-price-text">Stop-Limit</span></span>

    <div class="col-xs-6"><input class="js-trade-popup-stop-price js-trading-decimal-field trading-price-field textbox";最大长度=15"类型=文本"值="数据切换=工具提示";数据-html =真"数据触发器=手册";数据容器=正文"数据放置=正确"title="<div class='wikifolio-tooltip-icon'></div><div class='wikifolio-tooltip-text'>***</div>>

    <div class="row js-limit-or-stop-order-row";样式=显示:无"><div class="col-xs-6"><span class="settings-label">Limit</span>

    <div class="col-xs-6"><input class="js-trade-popup-limit-price js-trading-decimal-field trading-price-field textbox";类型=文本"最大长度=15"值="数据切换=工具提示";数据-html =真"数据触发器=手册";数据容器=正文"数据放置=正确"title="<div class='wikifolio-tooltip-icon'></div><div class='wikifolio-tooltip-text'>***</div>>

    <div class="row js-limit-or-stop-order-row";样式=显示:无"><div class="col-xs-6"><span class="settings-label limit-trade-valid-until-text hidden-xs">Gültig bis (Tagesende)</span><span class="settings-label limit-trade-valid-until-text hidden-sm hidden-md hidden-lg">Gültig bis</span>

    <div class="col-xs-6"><div class="js-datepicker-valid-until"><span class="textbox-icon-left textbox-icon-clickable js-valid-until-icon"><i class="icon-calendar2"></i></span><input class="limit-order-valid-until-date js-limit-order-valid-until 文本框";类型=文本"最大长度=10"值=23.10.2021";数据切换=工具提示";数据-html =真"数据触发器=手册";数据容器=正文"数据放置=正确"title="<div class='wikifolio-tooltip-icon'></div><div class='wikifolio-tooltip-text'>Ihre Order läuft zum gewählten Tag, 嗯 23:59 Uhr automatisch ab.</div>>>

    <div class="trade-popup-tpsl-xs-border u-mt-3";样式=显示:无"><div class="row js-trade-popup-tp-row";样式=显示:无"><div class="col-xs-12"><div class="trading-dialog-tpsl-row checkbox";数据切换=工具提示";数据-html =真"数据触发器=手册";数据容器=正文"数据放置=正确"title="<div class='wikifolio-tooltip-icon'></div><div class='wikifolio-tooltip-text'>***</div>><input id="modal-dialog-take-profit-checkbox";类型=复选框"class="trade-popup-take-profit-checkbox"><label for="modal-dialog-take-profit-checkbox";class="trading-dialog-take-profit-label">Take Profit platzieren</label>

    <div class="js-trade-popup-cell-tp-active js-trade-popup-cell-tp-deleted-container";样式=显示:无"><div class="row js-trade-popup-tp-row";样式=显示:无;"><div class="col-xs-6"><span class="settings-label"><span class="js-trade-popup-cell-tp-active";样式=显示:无;"><span class="limit-trade-amount-sum-text">Limit</span></span><span class="trade-popup-cell-tp-inactive js-trade-popup-cell-tp-deleted";style="display: none;"></span></span>

    <div class="col-xs-6 js-trade-popup-cell-tp-active";样式=显示:无;"><input class="inline js-take-profit-limit-price js-trading-decimal-field trading-price-field textbox";最大长度=15"类型=文本"值="数据切换=工具提示";数据-html =真"数据触发器=手册";数据容器=正文"数据放置=正确"title="<div class='wikifolio-tooltip-icon'></div><div class='wikifolio-tooltip-text'>Z***</div>>

    <div class="trade-popup-tpsl-xs-border u-mt-2";样式=显示:无;"><div class="row js-trade-popup-sl-row js-trade-popup-sl-row-first";样式=显示:无"><div class="col-xs-12"><div class="trading-dialog-tpsl-row checkbox";数据切换=工具提示";数据-html =真"数据触发器=手册";数据容器=正文"数据放置=正确"title="<div class='wikifolio-tooltip-icon'></div><div class='wikifolio-tooltip-text'>***</div>><input id="modal-dialog-stop-loss-checkbox";类型=复选框"class="trade-popup-stop-loss-checkbox"><label for="modal-dialog-stop-loss-checkbox";class=trading-dialog-stop-loss-label">Stop-Loss platzieren</label>

    <div class="js-trade-popup-cell-sl-active js-trade-popup-cell-sl-deleted-container";样式=显示:无"><div class="row js-trade-popup-sl-row trade-popup-sl-row js-trade-popup-sl-row-first";样式=显示:无;"><div class="col-xs-6"><span class="settings-label"><span style="display: none;";class="js-trade-popup-cell-sl-active">Stop-Limit</span><span class="js-trade-popup-cell-sl-inactive js-trade-popup-cell-sl-deleted";style="display: none;"></span></span>

    <div class="col-xs-6 js-trade-popup-cell-sl-active";样式=显示:无;"><input class="inline js-trade-popup-sl-stop-price js-trading-decimal-field trading-price-field textbox";最大长度=15"类型=文本"值="数据切换=工具提示";数据-html =真"数据触发器=手册";数据容器=正文"数据放置=正确"title="<div class='wikifolio-tooltip-icon'></div><div class='wikifolio-tooltip-text'>***</div>>

    <div class="row js-trade-popup-row-sl-active js-trade-popup-sl-row js-trade-popup-sl-row-second";样式=显示:无;"><div class="col-xs-6"><span class="settings-label"><span style="display: none;";class="js-trade-popup-cell-sl-active">Limit</span><span class="js-trade-popup-cell-sl-inactive"></span></span>

    <div class="col-xs-6 js-trade-popup-cell-sl-active";样式=显示:无;"><input class="inline js-trade-popup-sl-limit-price js-trading-decimal-field trading-price-field textbox";最大长度=15"类型=文本"值="数据切换=工具提示";数据-html =真"数据触发器=手册";数据容器=正文"数据放置=正确"title="<div class='wikifolio-tooltip-icon'></div><div class='wikifolio-tooltip-text'>***</div>>

    <div class="trading-panel-notice trade-panel-notice-tutorial js-tutorial-row text-center visible-xs";样式=显示:无;"><div class="js-limit-order-tutorial-row";样式=显示:无;">***<br>***<a class=区域大写"href="/de/de/hilfe/tutorials-trader/limit-orders";target=_blank"><span>mehr...</span></a>

    <div class="js-stop-limit-order-tutorial-row";样式=显示:无;">***<br>***<a class=区域大写"href="/de/de/hilfe/tutorials-trader/stop-limit-orders";target=_blank"><span>mehr...</span></a>

    ......

    现在的问题是:在我可以与输入字段交互之前,我是否需要处理父元素或祖先元素之一(例如 div)?

    我还想知道 HTML 中的这一部分是关于什么的:

    <div class="spinner-modal-wrapper"><div class="spinner"></div>

    这直接写在modal-dialog"之后HTML 中的 div.

    我还在 Stackoverflow 中检查了多个威胁.所有的解决方案都会导致一个 incorecct XPATH 定位器.但是为什么 XPATH 然后唯一地指向正确的输入字段,当我直接将其插入浏览器时,就像在屏幕截图中一样?

    有人能帮我解决这个问题吗?

    非常感谢,我很感激,本杰明

    解决方案

    1. Xpath 本质上很脆弱,请尝试使用相对 xpath 而不是 绝对 xpath.
    2. 确保在需要时使用 element_to_be_clickable.
    3. 您需要先清除输入字段,然后才能执行send_keys
    4. 使用显式等待.
    5. 以全屏模式启动浏览器.
    6. 首选是css选择器,最不首选的是xpath.

    代码:

    driver = webdriver.Chrome(driver_path)#driver.maximize_window()driver.implicitly_wait(30)等待 = WebDriverWait(驱动程序,30)driver.get(https://www.wikifolio.com/dynamic/de/de/login/login?ReturnUrl=/de/de/home&_=1632037782306")wait.until(EC.element_to_be_clickable((By.NAME, "Username"))).send_keys('******')wait.until(EC.element_to_be_clickable((By.ID, "Password"))).send_keys('******')wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button.gtm-login"))).click()driver.get(https://www.wikifolio.com/de/de/meine-wikifolios/trade/wf00wiking")wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "div.js-disclaimer__change"))).click()wait.until(EC.element_to_be_clickable((By.XPATH, "//a[@data-description='AKER CARB.CAPT.AS NK1']"))).click()select1 = Select(driver.find_element_by_css_selector(div.dropdown>select.order-type-selector"))select1.select_by_value('quote')#选择购买或销售操作:select2 = Select(driver.find_element_by_css_selector(div.dropdown>select.order-buysell-selector"))# 按值选择购买"select2.select_by_value('购买')buttonnew = wait.until(EC.element_to_be_clickable((By.XPATH, "(//input[contains(@class,'trading-amount')])[2]")))buttonnew.clear()buttonnew.send_keys(22")

    I try to interact with an input field with the following script:

    
    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
    from time import sleep
    
    
    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')
    
    
    
    
    buttonnew = wait.until(EC.presence_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()
    

    The Script executes correct unless it comes to the last part:

    buttonnew = wait.until(EC.presence_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()
    

    Here the execution stops.

    I checked the XPATH with the browser. It is unique. I checked with Chrome via "examine" and then pressing >CRTL + F<

    Here is a screenshot, that Chrome DOES indeed find the locator and it seems to be unique:

    That seems to indicate, that the XPATH is correct, and it is not a matter of "finding" the right XPATH but rather a matter of code execution or wrong programming.

    Also i was wondering, if the Input Field is wrapped inside a Shadow DOM or any other form of hidden structure.

    But if this was the case, why all the other field CAN be selected (like selecting from the dropdown) in the previous steps?

    To let you check that correctly i would provide the full html of that panel (because it is a window that opens within that page):

    <div>
                <div id="trade-dialog-container">
        <div id="trading-modal-root" role="dialog" class="modal fade publish trading-modal-root in" tabindex="-1" style="display: block; padding-right: 17px;">
            <div class="modal-dialog">
                <div class="modal-content">
                    <div class="authorization-request-panel" style="display: none;">
                        <div class="spinner-modal-wrapper">
                            <div class="spinner"></div>
                        </div>
                    </div>
                    <div class="trading-panel clearfix" style="">
                        <div class="trading-panel-close modal-close-button" data-dismiss="modal">
                            <i class="icon-close4"></i>
                        </div>
                        <div class="col-xs-12 col-sm-6 col-sm-push-6 col-md-push-6 col-lg-push-6 trading-panel-preview-col trade-panel-col">
                            <div class="trading-panel-preview">
                                <div class="trading-panel-preview-wrapper">
                                    <div id="trade-main-modal-header" class="trading-panel-header">
                <h4 class="trade-popup-title-shortdesc">AKER CARB.CAPT.AS NK1</h4>
                <span class="trade-popup-title-sub">
                    <span id="js-underlying-isin" data-issuer="1900">
                        NO0010890304 (L&amp;S Kurse)
                    </span>
                </span>
            </div>
                                    <div class="row trading-panel-price-container">
                                        <div class="col-xs-6 trading-panel-price-wrapper">
                                            <div class="trading-panel-price">
                                                <div class="currentBid text-center">2,392<small>EUR</small></div>
                                                <span class="trading-panel-price-sub">Verkaufskurs (Bid)</span>
                                            </div>
                                        </div>
                                        <div class="col-xs-6 trading-panel-price-wrapper">
                                            <div class="trading-panel-price">
                                                <div class="currentAsk text-center">2,423<small>EUR</small></div>
                                                <span class="trading-panel-price-sub">Kaufkurs (Ask)</span>
                                            </div>
                                        </div>
                                    </div>
                                    <div class="trading-panel-summary">
                                        <table class="trading-summary-panel">
                                            <tbody>
                                                <tr class="js-switch-nobuysell-row" style="display: none;">
                                                    <td colspan="2">Bestand (aktuell)</td>
                                                    <td class="text-bold text-right">
                                                        <span class="js-amount-underlying">14.477</span>&nbsp;Stk.
                                                    </td>
                                                </tr>
                                                <tr style="" class="js-switch-buysell-row">
                                                    <td>Bestand</td>
                                                    <td class="text-right trading-prev-value">
                                                        <span class="js-amount-underlying">14.477</span>&nbsp;Stk.
                                                        <i class="icon-right"></i>
                                                    </td>
                                                    <td class="text-bold text-right js-hideable-cell" style="visibility: visible;">
                                                        <span class="js-trade-amount-sum">14.478</span>&nbsp;Stk.
                                                    </td>
                                                </tr>
                                                <tr class="js-switch-nobuysell-row" style="display: none;">
                                                    <td colspan="2">Cash (aktuell)</td>
                                                    <td class="text-bold text-right">
                                                        <span data-value="264258.715" class="trade-popup-wikifolio-cash">264.258,715</span>
                                                    </td>
                                                </tr>
                                                <tr style="" class="js-switch-buysell-row">
                                                    <td>Cash</td>
                                                    <td class="text-right trading-prev-value">
                                                        <span data-value="264258.715" class="trade-popup-wikifolio-cash">264.258,715</span>
                                                        <i class="icon-right"></i>
                                                    </td>
                                                    <td class="text-bold text-right js-hideable-cell" style="visibility: visible;">
                                                        <span data-value="264258.715" class="trade-popup-cash-after-trade" data-cash="264256.292">264.256,292</span>&nbsp;*
                                                    </td>
                                                </tr>
                                                <tr>
                                                    <td colspan="2">Orderwert</td>
                                                    <td class="text-bold text-right js-hideable-cell" style="visibility: visible;">
                                                        <span class="js-order-value">2,423</span><span class="js-order-value-hidden" style="display: none;">&nbsp;*</span>
                                                    </td>
                                                </tr>
                                            </tbody>
                                        </table>
                                    </div>
                                    <div class=" row trading-panel-notice hidden-xs">
                                        <div class="col-sm-6">
                                            Alle Preise in EUR
                                        </div>
                                        <div class="col-sm-6 text-right">
                                            * abhängig vom Ausführungspreis
                                        </div>
                                    </div>
                                    <div class="trading-panel-message-container hidden-xs">
                                        <ul class="list-unstyled"></ul>
                                    </div>
                                </div>
                            </div>
                        </div>
                        <div class="col-xs-12 col-sm-6 col-sm-pull-6 col-md-pull-6 col-lg-pull-6 trading-panel-detail-col trade-panel-col">
                            <div class="trading-panel-settings">
                                <div class="trading-panel-settings-wrapper">
                                    <div class="row u-mb-3">
                                        <div class="col-xs-6">
                                            <div class="dropdown bootstrap-select js-order-type-select order-type-selector bs3" style="width: 100%;"><select class="js-order-type-select order-type-selector" style="opacity: 0" data-width="100%">
                                                <option value="quote" selected="selected">Quote</option>
                                                <option value="limit">Limit</option>
                                                    <option value="stop">Stop-Limit</option>
                                            </select><button type="button" tabindex="-1" class="btn dropdown-toggle btn-default" data-toggle="dropdown" role="combobox" aria-owns="bs-select-5" aria-haspopup="listbox" aria-expanded="false" title="Quote"><div class="filter-option"><div class="filter-option-inner"><div class="filter-option-inner-inner">Quote</div></div> </div><span class="bs-caret"><svg xmlns="http://www.w3.org/2000/svg" width="8" height="5" viewBox="0 0 8 5"><polyline fill="none" stroke="#BBC4C7" stroke-width="1.5" points="2.5 -.5 5.5 2.5 2.5 5.5" transform="rotate(90 4 2.5)"></polyline></svg></span></button><div class="dropdown-menu open" style="max-height: 592px; overflow: hidden; min-height: 0px;"><div class="inner open" role="listbox" id="bs-select-5" tabindex="-1" aria-activedescendant="bs-select-5-0" style="max-height: 592px; overflow-y: auto; min-height: 0px;"><ul class="dropdown-menu inner " role="presentation" style="margin-top: 0px; margin-bottom: 0px;"><li class="selected active"><a role="option" class="dropdown-item active selected" id="bs-select-5-0" tabindex="0" aria-setsize="3" aria-posinset="1" aria-selected="true"><span class="text">Quote</span></a></li><li><a role="option" class="dropdown-item" id="bs-select-5-1" tabindex="0"><span class="text">Limit</span></a></li><li><a role="option" class="dropdown-item" id="bs-select-5-2" tabindex="0"><span class="text">Stop-Limit</span></a></li></ul></div></div></div>
                                        </div>
                                        <div class="col-xs-6">
                                            <div class="dropdown bootstrap-select js-order-type-buysell order-buysell-selector bs3" style="width: 100%;"><select class="js-order-type-buysell order-buysell-selector" style="opacity: 0" data-width="100%" tabindex="null">
                                                <option selected="selected">Bitte wählen...</option>
                                                <option value="buy">Kauf</option>
                                                <option value="sell">Verkauf</option>
                                            </select><button type="button" tabindex="-1" class="btn dropdown-toggle btn-default" data-toggle="dropdown" role="combobox" aria-owns="bs-select-4" aria-haspopup="listbox" aria-expanded="false" title="Kauf"><div class="filter-option"><div class="filter-option-inner"><div class="filter-option-inner-inner">Kauf</div></div> </div><span class="bs-caret"><svg xmlns="http://www.w3.org/2000/svg" width="8" height="5" viewBox="0 0 8 5"><polyline fill="none" stroke="#BBC4C7" stroke-width="1.5" points="2.5 -.5 5.5 2.5 2.5 5.5" transform="rotate(90 4 2.5)"></polyline></svg></span></button><div class="dropdown-menu open" style="max-height: 592px; overflow: hidden; min-height: 0px;"><div class="inner open" role="listbox" id="bs-select-4" tabindex="-1" aria-activedescendant="bs-select-4-1" style="max-height: 592px; overflow-y: auto; min-height: 0px;"><ul class="dropdown-menu inner " role="presentation" style="margin-top: 0px; margin-bottom: 0px;"><li><a role="option" class="dropdown-item" id="bs-select-4-0" tabindex="0"><span class="text">Bitte wählen...</span></a></li><li class="selected active"><a role="option" class="dropdown-item active selected" id="bs-select-4-1" tabindex="0" aria-setsize="3" aria-posinset="2" aria-selected="true"><span class="text">Kauf</span></a></li><li><a role="option" class="dropdown-item" id="bs-select-4-2" tabindex="0"><span class="text">Verkauf</span></a></li></ul></div></div></div>
                                        </div>
                                    </div>
                                    <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 class="row js-stop-order-row" style="display: none">
                                        <div class="col-xs-6">
                                            <span class="settings-label"><span class="trade-popup-stop-price-text">Stop-Limit</span></span>
                                        </div>
                                        <div class="col-xs-6">
                                            <input class="js-trade-popup-stop-price js-trading-decimal-field trading-price-field textbox" maxlength="15" type="text" value="" data-toggle="tooltip" data-html="true" data-trigger="manual" data-container="body" data-placement="right" title="<div class=' wikifolio-tooltip-icon'></div>
                    <div class='wikifolio-tooltip-text'>***</div>">
                                        </div>
                                    </div>
                                    <div class="row js-limit-or-stop-order-row" style="display: none">
                                        <div class="col-xs-6">
                                            <span class="settings-label">Limit</span>
                                        </div>
                                        <div class="col-xs-6">
                                            <input class="js-trade-popup-limit-price js-trading-decimal-field trading-price-field textbox" type="text" maxlength="15" value="" data-toggle="tooltip" data-html="true" data-trigger="manual" data-container="body" data-placement="right" title="<div class=' wikifolio-tooltip-icon'></div>
                    <div class='wikifolio-tooltip-text'>***</div>">
                                        </div>
                                    </div>
                                    <div class="row js-limit-or-stop-order-row" style="display: none">
                                        <div class="col-xs-6">
                                            <span class="settings-label limit-trade-valid-until-text hidden-xs">Gültig bis (Tagesende)</span>
                                            <span class="settings-label limit-trade-valid-until-text hidden-sm hidden-md hidden-lg">Gültig bis</span>
                                        </div>
                                        <div class="col-xs-6">
                                            <div class="js-datepicker-valid-until">
                                                <span class="textbox-icon-left textbox-icon-clickable js-valid-until-icon">
                                                    <i class="icon-calendar2"></i>
                                                </span>
                                                <input class="limit-order-valid-until-date js-limit-order-valid-until textbox" type="text" maxlength="10" value="23.10.2021" data-toggle="tooltip" data-html="true" data-trigger="manual" data-container="body" data-placement="right" title="<div class=' wikifolio-tooltip-icon'></div>
                    <div class='wikifolio-tooltip-text'>Ihre Order läuft zum gewählten Tag, um 23:59 Uhr automatisch ab.</div>">
                                            </div>
                                        </div>
                                    </div>
                                        <div class="trade-popup-tpsl-xs-border u-mt-3" style="display: none">
                                            <div class="row js-trade-popup-tp-row" style="display: none">
                                                <div class="col-xs-12">
                                                    <div class="trading-dialog-tpsl-row checkbox" data-toggle="tooltip" data-html="true" data-trigger="manual" data-container="body" data-placement="right" title="<div class=' wikifolio-tooltip-icon'></div>
                    <div class='wikifolio-tooltip-text'>***</div>">
                                                        <input id="modal-dialog-take-profit-checkbox" type="checkbox" class="trade-popup-take-profit-checkbox">
                                                        <label for="modal-dialog-take-profit-checkbox" class="trading-dialog-take-profit-label">Take Profit platzieren</label>
                                                    </div>
                                                </div>
                                            </div>
                                            <div class="js-trade-popup-cell-tp-active js-trade-popup-cell-tp-deleted-container" style="display: none">
                                                <div class="row js-trade-popup-tp-row" style="display: none;">
                                                    <div class="col-xs-6">
                                                        <span class="settings-label">
                                                            <span class="js-trade-popup-cell-tp-active" style="display: none;">
                                                                <span class="limit-trade-amount-sum-text">Limit</span>
                                                            </span>
                                                            <span class="trade-popup-cell-tp-inactive js-trade-popup-cell-tp-deleted" style="display: none;"></span>
                                                        </span>
                                                    </div>
                                                    <div class="col-xs-6 js-trade-popup-cell-tp-active" style="display: none;">
                                                        <input class="inline js-take-profit-limit-price js-trading-decimal-field trading-price-field textbox" maxlength="15" type="text" value="" data-toggle="tooltip" data-html="true" data-trigger="manual" data-container="body" data-placement="right" title="<div class=' wikifolio-tooltip-icon'></div>
                    <div class='wikifolio-tooltip-text'>Z***</div>">
                                                    </div>
                                                </div>
                                            </div>
                                        </div>
                                        <div class="trade-popup-tpsl-xs-border u-mt-2" style="display: none;">
                                            <div class="row js-trade-popup-sl-row js-trade-popup-sl-row-first" style="display: none">
                                                <div class="col-xs-12">
                                                    <div class="trading-dialog-tpsl-row checkbox" data-toggle="tooltip" data-html="true" data-trigger="manual" data-container="body" data-placement="right" title="<div class=' wikifolio-tooltip-icon'></div>
                    <div class='wikifolio-tooltip-text'>***</div>">
                                                        <input id="modal-dialog-stop-loss-checkbox" type="checkbox" class="trade-popup-stop-loss-checkbox">
                                                        <label for="modal-dialog-stop-loss-checkbox" class="trading-dialog-stop-loss-label">Stop-Loss platzieren</label>
                                                    </div>
                                                </div>
                                            </div>
                                            <div class="js-trade-popup-cell-sl-active js-trade-popup-cell-sl-deleted-container" style="display: none">
                                                <div class="row js-trade-popup-sl-row trade-popup-sl-row js-trade-popup-sl-row-first" style="display: none;">
                                                    <div class="col-xs-6">
                                                        <span class="settings-label">
                                                            <span style="display: none;" class="js-trade-popup-cell-sl-active">Stop-Limit</span>
                                                            <span class="js-trade-popup-cell-sl-inactive js-trade-popup-cell-sl-deleted" style="display: none;"></span>
                                                        </span>
                                                    </div>
                                                    <div class="col-xs-6 js-trade-popup-cell-sl-active" style="display: none;">
                                                        <input class="inline js-trade-popup-sl-stop-price js-trading-decimal-field trading-price-field textbox" maxlength="15" type="text" value="" data-toggle="tooltip" data-html="true" data-trigger="manual" data-container="body" data-placement="right" title="<div class=' wikifolio-tooltip-icon'></div>
                    <div class='wikifolio-tooltip-text'>***</div>">
                                                    </div>
                                                </div>
                                                <div class="row js-trade-popup-row-sl-active js-trade-popup-sl-row js-trade-popup-sl-row-second" style="display: none;">
                                                    <div class="col-xs-6">
                                                        <span class="settings-label">
                                                            <span style="display: none;" class="js-trade-popup-cell-sl-active">Limit</span>
                                                            <span class="js-trade-popup-cell-sl-inactive"></span>
                                                        </span>
                                                    </div>
                                                    <div class="col-xs-6 js-trade-popup-cell-sl-active" style="display: none;">
                                                        <input class="inline js-trade-popup-sl-limit-price js-trading-decimal-field trading-price-field textbox" maxlength="15" type="text" value="" data-toggle="tooltip" data-html="true" data-trigger="manual" data-container="body" data-placement="right" title="<div class=' wikifolio-tooltip-icon'></div>
                    <div class='wikifolio-tooltip-text'>***</div>">
                                                    </div>
                                                </div>
                                            </div>
                                        </div>
                                    <div class="trading-panel-notice trading-panel-notice-tutorial js-tutorial-row text-center visible-xs" style="display: none;">
                                        <div class="js-limit-order-tutorial-row" style="display: none;">
                                           ***
                                            <br>
                                            ***
                                            <a class="area capitalized" href="/de/de/hilfe/tutorials-trader/limit-orders" target="_blank"><span>mehr...</span></a>
                                        </div>
                                        <div class="js-stop-limit-order-tutorial-row" style="display: none;">
                                           ***
                                            <br>
                                            ***
                                            <a class="area capitalized" href="/de/de/hilfe/tutorials-trader/stop-limit-orders" target="_blank"><span>mehr...</span></a>
                                        </div>
                                    </div>
                                </div>
                            </div>
                        </div>
    
    .......
    
    

    Now the question: do i need to adress one of the parent or ancestor elements (divs for example) BEFORE i can interact with the input field?

    Also i was wondering what this part in the HTML is about:

    <div class="authorization-request-panel" style="display: none;">
                        <div class="spinner-modal-wrapper">
                            <div class="spinner"></div>
                        </div>
                    </div>
    

    This is written directly after the "modal-dialog" div in the HTML.

    I also checked multiple threats here in Stackoverflow. All of the solutions lead to an incorecct XPATH Locator. But why the XPATH then uniquely points to the correct input field, when i insert this into the browser directly, like it is in the screenshot?

    Can anyone help me with that issue?

    Thanks a lot, i appreciate, Benjamin

    解决方案

    1. Xpath is brittle in nature, try to use relative xpath rather than absolute xpath.
    2. Make sure to use element_to_be_clickable when it is required.
    3. You need to clear the input field first and then you can do send_keys
    4. Use explicit waits.
    5. Launch browser in full screen mode.
    6. Preference is css selector, and least preferable choice is xpath.

    Code :

    driver = webdriver.Chrome(driver_path)
    #driver.maximize_window()
    driver.implicitly_wait(30)
    wait = WebDriverWait(driver, 30)
    driver.get("https://www.wikifolio.com/dynamic/de/de/login/login?ReturnUrl=/de/de/home&_=1632037782306")
    
    wait.until(EC.element_to_be_clickable((By.NAME, "Username"))).send_keys('******')
    wait.until(EC.element_to_be_clickable((By.ID, "Password"))).send_keys('******')
    wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button.gtm-login"))).click()
    
    driver.get("https://www.wikifolio.com/de/de/meine-wikifolios/trade/wf00wiking")
    wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "div.js-disclaimer__change"))).click()
    wait.until(EC.element_to_be_clickable((By.XPATH, "//a[@data-description='AKER CARB.CAPT.AS NK1']"))).click()
    select1  = Select(driver.find_element_by_css_selector("div.dropdown>select.order-type-selector"))
    select1.select_by_value('quote')
    
    #to select purchase or sale action:
    select2 = Select(driver.find_element_by_css_selector("div.dropdown>select.order-buysell-selector"))
    # select by value "buy"
    select2.select_by_value('buy')
    
    buttonnew = wait.until(EC.element_to_be_clickable((By.XPATH, "(//input[contains(@class,'trading-amount')])[2]")))
    buttonnew.clear()
    buttonnew.send_keys("22")
    

    这篇关于Selenium:正确的定位器但不能与元素交互(输入字段)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

    查看全文
    相关文章
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆