【问题标题】:Selenium/Python - How to click on a button that appears only when cursor is hovering over it?Selenium/Python - 如何单击仅在光标悬停在其上时出现的按钮?
【发布时间】:2016-02-29 09:37:37
【问题描述】:

基本上在 UI 上有一个按钮,只有在悬停时才可见。我需要能够在“删除”按钮可见时单击它。如果有某种方法我可以通过检查“编辑测试合同 1”一词来检查我是否悬停在正确的东西上,那将是理想的:uib-tooltip="Edit Test Contract 1">

HTML代码:

<div class="ibox-content no-margins ">
<span tooltip-class="beacon-uib-tooltip" tooltip-append-to-body="true" uib-tooltip="Edit Test Contract 1">
<button class="name btn-link ng-binding ng-isolate-scope" ng-disabled="disableEdit()" mit-mini-modal="" ng-click="editContract(contract)">Test Contract 1</button>
</span>
<span class="icon-container hide-when-dragging">
<div class="show-when-hovering">
<span class="fa fa-times delete-icon ng-isolate-scope" uib-tooltip="Delete" tooltip-append-to-body="true" mit-mini-modal="" ng-click="deleteContract()"></span>

尽管我正在寻找正确的 css ng-click="deleteContract()",但由于某种原因,我的 atm 代码没有返回任何内容。我尝试单击删除按钮的方法是delete_contract()。如果您需要更多信息,请告诉我,我已尽量详细说明。

class Locator:
    def __init__(self, selenium_context, short_wait_time_sec):
        self.selenium_context = selenium_context
        self.short_wait_time_sec = short_wait_time_sec

def find_elements_css(self, cssSelector):
    return self.selenium_context.find_elements_by_css_selector(cssSelector)

def delete_contract(self, contract_name):
    self.contract_list = self.page_loc.find_elements_css('button[ng-click="deleteContract()"]')
    for contract in self.contract_list:
        if contract.text == contract_name:
            contract.click()
            break

【问题讨论】:

    标签: python html python-3.x selenium selenium-webdriver


    【解决方案1】:

    你可以使用ActionChains来模拟悬停

    def delete_contract(self, contract_name):
        action = ActionChains(selenium_context) # create ActionChains object
        contract = page_loc.find_element_by_css_selector('span[ng-click="deleteContract()"]')
        action.move_to_element(contract).perform() # move the mouse to the element
        contract.click()
    

    删除按钮位于&lt;span&gt; 标记中,而不是&lt;button&gt; 标记中。 cssSelctor 应该是 'span[ng-click="deleteContract()"]'

    【讨论】:

    • 唯一的问题是 contract_name 字段是 Test Contract 1 并且 self.contract_list 返回 [] 尽管搜索了正确的代码,关于你的第三行代码的任何想法你的答案可能做错了吗?另外你知道我怎样才能根据上面的 html 代码检查正确的contract_name,我应该先搜索一个类吗?
    • @user4659009 我编辑了我的答案。文本Test Contract 1 属于另一个元素,删除按钮没有文本。你无法比较它们。
    • 有道理,我已经尝试了您编辑的答案,它在代码的最后第二行失败,并显示以下错误消息:File "/Users/ss/anaconda/envs/web/lib/python3.4/site-packages/selenium/webdriver/common/action_chains.py", line 72, in perform action()File "/Users/ss/anaconda/envs/web/lib/python3.4/site-packages/selenium/webdriver/common/action_chains.py", line 217, in &lt;lambda&gt; self._driver.execute(Command.MOVE_TO, {'element': to_element.id})) AttributeError: 'WebElement' object has no attribute 'execute'
    • @user4659009 试试page_loc.find_element_by_css_selector('span[ng-click="deleteContract()"]')
    • contract 返回以下内容,不确定这是否有助于查看可能导致问题的原因? - &lt;selenium.webdriver.remote.webelement.WebElement (session="c481cda6-ed6e-2949-ae43-7db74c5ea9f6", element="{a251e594-671d-b344-a750-4877b121c554}")&gt;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-03
    • 1970-01-01
    • 2020-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多