如何使用Selenium单击自定义HTML标签

时间:2019-04-27 01:54:38

标签: python selenium

我正在尝试从Sellercentral.amazon.de下载几百个excel文件。如我之前的文章所述,手动下载不是一种选择,因为我需要单击几次才能下载弹出窗口。

为此,我正在使用Python和Selenium。

问题

但是,要抓取的网站不仅包含按钮和链接,还包含自定义标签。标签之一是“浏览节点组件”,每个标签代表一个产品(子)类别。找到它没什么大不了的,但是单击它不会执行。需要单击才能在类别中导航至其子级,直到到达叶节点为止。然后,图标从箭头变为“选择”(请参见imgur)。

到目前为止,我尝试过的代码是:

elements = driver.find_elements_by_tag_name("browse-node-component")

for element in elements:

    print("starting")

    # Store element name    
    browse_node = element.find_element_by_class_name("browse-node-text")
    browse_node = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CLASS_NAME, "browse-node-text")))

    browse_node_button = element.find_element_by_class_name("a-button-input")
    print ("done")
    browse_node_button.click()

示例性的“浏览节点组件”标签     

    <span>
        <div class="a-section a-spacing-none browse-node selected-node" ng-class="(nodeCtrl.node.hasChildren ? 'browse-node' : 'leaf-node') + ' ' + (nodeCtrl.isSelected ? 'selected-node' : '')" ng-click="nodeCtrl.node.hasChildren &amp;&amp; nodeCtrl.onBrowseChildren({node:nodeCtrl.node});">

            <div class="browse-node-text ng-binding" style="">Auto &amp; Motorrad</div>

            <div class="node-icon-btn-block">

                <img class="loading-icon ng-hide" src="https://m.media-amazon.com/images/G/01/abis-ui/loading-small._CB192205764_.gif" ng-show="nodeCtrl.isLoading">
                <div class="lock-icon ng-hide" ng-show="nodeCtrl.isGated"></div>
                <div class="a-icon arrow-right browse-node-arrow" ng-show="nodeCtrl.node.hasChildren"></div>

                <div class="select-button-ungated ng-hide" ng-show="!nodeCtrl.isGated &amp;&amp; !nodeCtrl.node.hasChildren" ng-click="nodeCtrl.onSelectNode({node:nodeCtrl.node})">
                    <span class="a-button a-button-base a-button-small select-button"><span class="a-button-inner"><input class="a-button-input" type="submit"><span class="a-button-text" aria-hidden="true">
                       Auswählen
                    </span></span></span>
                </div>

                <div class="gated-button ng-hide" ng-click="nodeCtrl.onRequestApproval({node:nodeCtrl.node})" ng-show="nodeCtrl.isGated &amp;&amp; !nodeCtrl.node.hasChildren">
                    <span class="a-button a-button-primary a-button-small select-button"><span class="a-button-inner"><input class="a-button-input" type="submit"><span class="a-button-text" aria-hidden="true">
                        Freischaltung beantragen
                    </span></span></span>
                </div>

            </div>
        </div>
    <span>
</span></span></browse-node-component>

结果

最后的输出是“ done”,然后脚本终止,并显示以下消息:

Message: Element 'input class="a-button-input" type="submit"' could not be scrolled into view

但是我不确定我是否真的必须按下该按钮。我按的是对的吗?如果是这样,我该如何做而不会出错?

我想浏览这些类别,直到到达子节点,然后按它的选择按钮。但是我无法用我的代码显示顶级类别的子类别。请提示我必须单击哪个html元素。

有关图形信息,请参见此处:https://imgur.com/a/8eWGz8s

1 个答案:

答案 0 :(得分:0)

尝试以下方法。

browse_node_button.location_once_scrolled_into_view
browse_node_button.click()

如果上述方法无效,则可能需要使用JS单击browse_node_button

driver.execute_script("arguments[0].click();", browse_node_button)