【问题标题】:Unable to click on element with link in selenium python无法在 selenium python 中单击带有链接的元素
【发布时间】:2015-03-08 04:39:21
【问题描述】:

我正在尝试与退出按钮进行交互,但我似乎无法使用链接文本或 xpath 来点击它。

我尝试过以下这些答案,但没有成功:

这是我的代码:

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

from xatu.tests.base import login
from xatu.tests.bagon import BagonBaseTestCase


class BasicTestCase(BagonBaseTestCase):

    @login
    def test_logout(self):
        self._wait_until_id_presents("quotes-form")
        WebDriverWait(self, 10).until(
        EC.presence_of_element_located((By.XPATH, "//a[@href='/login/clear']/i")))
        self.browser.find_element_by_xpath("//a[@href='/login/clear']/i").click()
        self.implicitly_wait(2)
        self._title_check("Login")

test_logout 下的第一行调用了一个函数,该函数等待某个元素出现在网页上,以便我可以看到页面已加载。然后我尝试点击退出按钮。

这是 HTML(元素位于 class="btn" href="/login/clear"):

<div class="navbar navbar-fixed-top screen-only">
    <div class="navbar-inner">
        <div class="container-fluid">
            <a class="btn btn-navbar" data-target=".nav-collapse" data-toggle="collapse">
            <a class="brand" href="/">
            <div class="nav-collapse collapse">
                <ul class="nav">
                <p class="pull-right" style="margin-top: 4px; margin-left: 4px;">
                    <a class="btn" href="/login/clear">
                        <i class="icon-off"/>
                             Sign out
                    </a>
                </p>
                <p class="navbar-text pull-right">                         Logged-in as D. V.                  Lauper                     </p>
            </div>
            <!--/.nav-collapse -->
        </div>
    </div>
</div>

当我尝试通过 link_text 查找时,找不到该元素。运行此代码会给我一个堆栈跟踪错误:

ElementNotVisibleException: Message: Element is not currently visible and so may not be interacted with

编辑:我已经尝试了 Saifur 的答案并将我的代码更新为他的答案,但现在我得到:AttributeError:'BasicTestCase' 对象没有属性'find_element'。我尝试将“self”更改为“self.browser”作为 WebDriverWait() 中的参数,但我会得到原来的错误。

【问题讨论】:

    标签: python button selenium hyperlink


    【解决方案1】:

    使用explicit wait 和相关xpath

    点赞//a[@href='/login/clear']/i

    from xatu.tests.base import login
    from xatu.tests.bagon import BagonBaseTestCase  
    
    class BasicTestCase(BagonBaseTestCase):
    
        @login
        def test_logout(self):
            self._wait_until_id_presents("quotes-form")
            WebDriverWait(self, 10).until(
            EC.presence_of_element_located((By.XPATH, "//a[@href='/login/clear']/i")))      
            self.browser.find_element_by_xpath("//a[@href='/login/clear']/i").click()
            self.browser.implicitly_wait(2)
            self._title_check("Login")
    

    【讨论】:

    • 感谢您的回答。我在运行您的代码时遇到错误。 AttributeError:“BasicTestCase”对象没有属性“find_element”。我尝试将 WebDriverWait 中的“self”更改为“self.browser”,但我会得到原来的错误。另外,我相信您缺少一个额外的括号。
    • 感谢您引起我的注意。我更正了)。而且,您应该在 `WebDriverWait(self, 10)` 中传递驱动程序实例,无论它是什么,请确保您也导入了正确的引用。见this
    • 你还在收到exception吗?
    • 我没有得到例外。当我运行您的代码时,只是那个属性错误。从 selenium expected_conditions pakcage 的 Traceback 中弹出一些错误。
    • 它没有。由于该属性错误,测试停止并失败。顺便说一句,如果有帮助,我正在使用鼻子测试。
    【解决方案2】:

    您需要一个明确的等待。 See docs。示例代码:

    element = WebDriverWait(driver, 30).until(EC.visibility_of_element_located((By.XPATH,'//a[@href="/login/clear"]')))
    

    然后只需单击该元素。

    element.click()
    

    注意我添加了我的答案 b/c——至少在我的测试中——你不需要担心 italics 标签。那是文本,而不是按钮——而且你没有点击文本。因此,找到 By.XPATH 并选择一个唯一属性(即,在这种情况下是 href,很可能而不是 class attr),然后单击您的元素。

    编辑:

    请试试这条线:

    element = WebDriverWait(self.browser, 30).until(EC.visibility_of_element_located((By.XPATH,'//a[@class="btn" and @href="/login/clear"]')))
    

    【讨论】:

    • 感谢您的回复。当我尝试您的方法时,我遇到了超时问题。它实际上在 30 秒内由于某种原因找不到它,这应该是足够的时间,因为当我手动点击时,网页会在大约 2 秒内加载。我还将“驱动程序”更改为“self.browser”,因为这是我指向 webdriver.FireFox() 的变量
    • @AlphaFoxtrot 那么它工作正常还是您需要更多帮助?今天早上我在我的电脑前,很乐意做我能做的事。告诉我!
    • 我们将不胜感激!当我运行您的代码时,我会遇到超时问题。但是我没有收到我原来的错误,现在的错误是:“raise TimeoutException(message) TimeoutException: Message:” 没有消息,因为我没有,但在你给它的时间内找不到元素。我在您的代码中唯一更改的是 WebDriverWait() 中的“驱动程序”到“self.browser”
    • 我已经根据 Saifur 的回答更新了我的代码,我也在和他一起努力解决这个问题。他的代码与您的代码不同。
    • @AlphaFoxtrot 好吧,试试他/她的东西,然后,如果它不起作用,请告诉我。我很乐意提供帮助,但我相信你和 Saifur 都能做到。让我知道!谢谢!
    猜你喜欢
    • 1970-01-01
    • 2016-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多