繁体   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