无法在selenium python中单击带链接的元素

时间:2015-01-09 19:21:29

标签: python button selenium hyperlink

我正在尝试与注销按钮进行交互,但我似乎无法使用链接文本或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()中的参数,但我会得到原始错误。

2 个答案:

答案 0 :(得分: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")

答案 1 :(得分:1)

您需要明确的等待。 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"]')))