簡體   English   中英

無法使用python編寫的xpath在硒中定位元素

[英]Unable to locate element with in selenium using xpath written in python

我正在嘗試使用python和硒自動從以下網站進行iCal下載:webuntis.dk。 到目前為止,我已經設法讓python在登錄站點上輸入au_health的憑據。 接下來,我需要按一下右上角的小日歷圖標。 它不斷返回:

NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"/a[@id="Timetable_toolbar_icalButton"]"}

我的代碼如下:

from selenium import webdriver

browser = webdriver.Chrome('/Users/juliushvidt/Desktop/chromedriver')

browser.get('https://webuntis.dk/WebUntis/login.do')


username = browser.find_element_by_id("school")

username.send_keys("au_health")


NEXT_BUTTON_XPATH = '//input[@type="submit"]'
button = browser.find_element_by_xpath(NEXT_BUTTON_XPATH)
button.click()

browser.get('https://webuntis.dk/WebUntis/index.do#Timetable?type=3&id=1140')

driver = browser

time.sleep(5.5) #this did the trick

NEXT_BUTTON_XPATH = '//button[@id="Timetable_toolbar_icalButton"]' #using the current button notation was definitely also contributing :)
button = browser.find_element_by_xpath(NEXT_BUTTON_XPATH)
button.click()

我試圖在網站上嘗試訪問的元素得到以下源代碼:

在此處輸入圖片說明

希望您能指出我正確的方向,因為我感到茫然。

來自網站的代碼:

<div data-dojo-type="dijit/layout/ContentPane" data-dojo-attach-point="_toolbarContainer" class="dijitContentPane toolbarContainer dijitBorderContainerNoGutter-child dijitBorderContainerNoGutter-dijitContentPane dijitBorderContainerNoGutterPane dijitAlignTop" data-dojo-props="region: 'top'" id="dijit_layout_ContentPane_0" widgetid="dijit_layout_ContentPane_0" style="left: 0px; top: 0px; position: absolute; width: 31px;"><div class="grupetWidgetToolbar" id="Timetable_toolbar" widgetid="Timetable_toolbar"><div class="grupetWidgetLabelPanel" id="grupet_widget_LabelPanel_0" widgetid="grupet_widget_LabelPanel_0" style="display: inline-block; vertical-align: middle;">
    <div class="grupetWidgetLabelPanelText_ABOVE" data-dojo-attach-point="textNode">Fag</div>
    <div class="grupetWidgetLabelPanelContainer_ABOVE" data-dojo-attach-point="containerNode"><div class="dijit dijitReset dijitInline dijitLeft dijitTextBox dijitComboBox dijitValidationTextBox" id="widget_Timetable_toolbar_elementSelect" role="combobox" aria-haspopup="true" data-dojo-attach-point="_popupStateNode" widgetid="Timetable_toolbar_elementSelect"><div class="dijitReset dijitRight dijitButtonNode dijitArrowButton dijitDownArrowButton dijitArrowButtonContainer" data-dojo-attach-point="_buttonNode" role="presentation"><input class="dijitReset dijitInputField dijitArrowButtonInner" value="▼ " type="text" tabindex="-1" readonly="readonly" role="button presentation" aria-hidden="true"></div><div class="dijitReset dijitValidationContainer"><input class="dijitReset dijitInputField dijitValidationIcon dijitValidationInner" value="Χ " type="text" tabindex="-1" readonly="readonly" role="presentation"></div><div class="dijitReset dijitInputField dijitInputContainer"><input class="dijitReset dijitInputInner" type="text" autocomplete="off" data-dojo-attach-point="textbox,focusNode" role="textbox" aria-autocomplete="list" tabindex="0" id="Timetable_toolbar_elementSelect" aria-required="false" value="1. sem. Medicinsk filosofi forelæsning" aria-invalid="false"><span class="dijitPlaceHolder dijitInputField" style="display: none;">Vælg her</span><input type="hidden" value="1140"></div></div></div>
</div><div class="grupetWidgetLabelPanel" id="grupet_widget_LabelPanel_1" widgetid="grupet_widget_LabelPanel_1" style="display: inline-block; vertical-align: middle;">
    <div class="grupetWidgetLabelPanelText_ABOVE" data-dojo-attach-point="textNode">Afdeling</div>
    <div class="grupetWidgetLabelPanelContainer_ABOVE" data-dojo-attach-point="containerNode"><div class="dijit dijitReset dijitInline dijitLeft grupetWidgetHasResetButton dijitTextBox dijitComboBox dijitValidationTextBox" id="widget_Timetable_toolbar_elementFilter_IDC_ABTEILUNG" role="combobox" aria-haspopup="true" data-dojo-attach-point="_popupStateNode" widgetid="Timetable_toolbar_elementFilter_IDC_ABTEILUNG"><div class="dijitReset dijitRight dijitButtonNode dijitArrowButton dijitDownArrowButton dijitArrowButtonContainer" data-dojo-attach-point="_buttonNode" role="presentation"><input class="dijitReset dijitInputField dijitArrowButtonInner" value="▼ " type="text" tabindex="-1" readonly="readonly" role="button presentation" aria-hidden="true"></div><div class="dijitReset dijitValidationContainer"><input class="dijitReset dijitInputField dijitValidationIcon dijitValidationInner" value="Χ " type="text" tabindex="-1" readonly="readonly" role="presentation"></div><div class="dijitReset dijitRight dijitButtonNode grupetWidgetResetButton grupetWidgetResetButtonContainer grupetDisplayNone">
    <input type="text" role="presentation" readonly="readonly" tabindex="-1" value=" " title="Nulstil" class="dijitReset dijitInputField grupetWidgetResetButtonInner">
</div><div class="dijitReset dijitInputField dijitInputContainer"><input class="dijitReset dijitInputInner" type="text" autocomplete="off" data-dojo-attach-point="textbox,focusNode" role="textbox" aria-autocomplete="list" tabindex="0" id="Timetable_toolbar_elementFilter_IDC_ABTEILUNG" aria-required="false" value="" aria-invalid="false"><span class="dijitPlaceHolder dijitInputField">Vælg her</span><input type="hidden" value=""></div></div></div>
</div><div class="grupetWidgetLabelPanel" id="grupet_widget_LabelPanel_2" widgetid="grupet_widget_LabelPanel_2" style="display: inline-block; vertical-align: middle;">
    <div class="grupetWidgetLabelPanelText_ABOVE" data-dojo-attach-point="textNode">Aktuel uge</div>
    <div class="grupetWidgetLabelPanelContainer_ABOVE" data-dojo-attach-point="containerNode"><div class="dijit dijitReset dijitInline dijitLeft date-week-select dijitTextBox dijitComboBox dijitDateTextBox dijitValidationTextBox" id="widget_timetablePageToolbar_dateWeekSelect" role="combobox" aria-haspopup="true" data-dojo-attach-point="_popupStateNode" widgetid="timetablePageToolbar_dateWeekSelect"><div class="dijitReset dijitRight dijitButtonNode dijitArrowButton dijitDownArrowButton dijitArrowButtonContainer" data-dojo-attach-point="_buttonNode" role="presentation"><input class="dijitReset dijitInputField dijitArrowButtonInner" value="▼ " type="text" tabindex="-1" readonly="readonly" role="button presentation" aria-hidden="true"></div><div class="dijitReset dijitValidationContainer"><input class="dijitReset dijitInputField dijitValidationIcon dijitValidationInner" value="Χ " type="text" tabindex="-1" readonly="readonly" role="presentation"></div><span role="button" class="fa fa-caret-right"></span><span role="button" class="fa fa-caret-left"></span><div class="dijitReset dijitInputField dijitInputContainer"><input class="dijitReset dijitInputInner" type="text" autocomplete="off" data-dojo-attach-point="textbox,focusNode" role="textbox" tabindex="0" id="timetablePageToolbar_dateWeekSelect" value="04/12/2017" aria-invalid="false"><input type="hidden" value="2017-12-04"></div></div></div>
</div><span class="dijit dijitReset dijitInline gp-iconfont-button dijitDropDownButton" widgetid="Timetable_toolbar_settingsButton" style="display: inline-block; vertical-align: middle; float: right;"><span class="dijitReset dijitInline dijitButtonNode" data-dojo-attach-event="ondijitclick:__onClick" data-dojo-attach-point="_buttonNode"><span class="dijitReset dijitStretch dijitButtonContents dijitDownArrowButton" data-dojo-attach-point="focusNode,titleNode,_arrowWrapperNode,_popupStateNode" role="button" aria-haspopup="true" aria-labelledby="Timetable_toolbar_settingsButton_label" tabindex="0" id="Timetable_toolbar_settingsButton" aria-disabled="false" style="user-select: none;"><span class="dijitReset dijitInline dijitIcon fa fa-2x fa-cog" data-dojo-attach-point="iconNode"></span><span class="dijitReset dijitInline dijitButtonText" data-dojo-attach-point="containerNode" id="Timetable_toolbar_settingsButton_label"></span><span class="dijitReset dijitInline dijitArrowButtonInner"></span><span class="dijitReset dijitInline dijitArrowButtonChar">▼</span></span></span><input type="button" value="" class="dijitOffScreen" tabindex="-1" data-dojo-attach-event="onclick:_onClick" data-dojo-attach-point="valueNode" role="presentation" aria-hidden="true"></span><button type="button" class="gp-iconfont-button fa fa-2x fa-print" id="Timetable_toolbar_printButton" title="Udskriftsversion" aria-label="Udskriftsversion" widgetid="Timetable_toolbar_printButton" style="display: inline-block; vertical-align: middle; float: right;"></button><button type="button" class="icon-ical-24 imageButton imageButtonFocused dijitFocused" title="ICS kalender" aria-label="ICS kalender" id="Timetable_toolbar_icalButton" widgetid="Timetable_toolbar_icalButton" style="display: inline-block; vertical-align: middle; float: right;"><div class="icon icon-ical-24"></div></button></div></div>

僅使用一個斜杠,XPATH就不會向下看。 為此,您需要使用兩個斜杠。 此外,圖像中的源還表明您正在嘗試到達<button>元素。 試試這個吧。

NEXT_BUTTON_XPATH = '//button[@id="Timetable_toolbar_icalButton"]'

編輯:我看到頁面的各個部分是動態加載的,因此您明確需要等待按鈕添加到頁面中。 以下應該可以解決問題:

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

...

NEXT_BUTTON_XPATH = '//button[@id="Timetable_toolbar_icalButton"]'
wait = WebDriverWait(driver, 10)
condition = expected_conditions.presence_of_element_located(
    (By.XPATH, NEXT_BUTTON_XPATH))
button = wait.until(condition)
button.click()

注意:使用time.sleep(5.5)在某些情況下可能會起作用,但並非總是如此,因為它取決於呈現頁面的時間。 使用WebDriverWait將確保:

  1. 您不依賴時間。
  2. 元素可用后,代碼將立即返回。

一些提示:在Chrome開發者控制台中,您可以測試xpath表達。 為此,請首先轉到“元素”選項卡。 然后按Ctrl+F 然后,您可以輸入xpath表達式進行測試。

原來這是一個時間問題。 使用以下命令進行測試:

時間睡眠(5.5)

並正確下載了文件。 感謝您提供的所有幫助。 如果沒有它,我肯定無法弄清楚。 干杯:)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM