Веб-драйвер салата не может найти мою ссылку по xpath

Салат получает управляемые поведением "предложения" и выполняет код для использования в тестах.

Существует "веб-драйвер", который прекрасно интегрирует это с селеном.

Моя ссылка выглядит так:

<div class="pull-right">
    <a href="/logout">Logout ?</a>
</div>

И я пытаюсь использовать (любой из) шаги, описанные в readme github:

I should see a link to "Google" with the url "http://google.com/"
I should see a link that contains the text "Foobar" and the url "http://foobar.com/"

Что соответствует этому коду:

@step('I should see a link to "(.*?)" with the url "(.*?)"$')
def should_see_link_text(step, link_text, link_url):
    assert_true(step,
                world.browser.find_element_by_xpath(str(
                    '//a[@href="%s"][./text()="%s"]' %
                    (link_url, link_text))))


@step('I should see a link that contains the text "(.*?)" '
      'and the url "(.*?)"$')
def should_include_link_text(step, link_text, link_url):
    return world.browser.find_element_by_xpath(str(
        '//a[@href="%s"][contains(., %s)]' %
        (link_url, link_text)))

Но когда я выбираю свою ссылку в Chrome Dev Tools, она выглядит следующим образом:

//*[@id="bs-example-navbar-collapse-1"]/div/div[2]/a

Что не похоже на: '//a[@href="%s"][contains(., %s)]' или же '//a[@href="%s"][./text()="%s"]',

Так какой шаг я должен использовать, чтобы захватить мою ссылку, и нужно ли мне изменить мой HTML, чтобы он соответствовал тому, что доступно в lettuce-webdriver (подсказка: это не будет хорошо!)? Желательно без указания идентификатора или класса и т. Д.

Редактировать: Ошибка LWD дает это:

    Traceback (most recent call last):
      File "C:\Python34\lib\site-packages\lettuce\core.py", line 144, in __call__ret = self.function(self.step, *args, **kw)
      File "C:\Python34\lib\site-packages\lettuce_webdriver\webdriver.py", line 107, in should_include_link_text(link_url, link_text)))
      File "C:\Python34\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 230, in find_element_by_xpath return self.find_element(by=By.XPATH, value=xpath)
      File "C:\Python34\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 662, in find_element {'using': by, 'value': value})['value']
      File "C:\Python34\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 173, in execute self.error_handler.check_response(response)
      File "C:\Python34\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 166, in check_response raise exception_class(message, screen, stacktrace) selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: {"method":"xpath","selector":"//a[@href=\"/logout\"][contains(., \"Logout ?\")]"}
    Stacktrace:
        at FirefoxDriver.prototype.findElementInternal_ (file:///D:/Users/CAStone/AppData/Local/Temp/tmpkxv5zfva/extensi
ons/fxdriver@googlecode.com/components/driver-component.js:9641:26)
        at FirefoxDriver.prototype.findElement (file:///D:/Users/CAStone/AppData/Local/Temp/tmpkxv5zfva/extensions/fxdri
ver@googlecode.com/components/driver-component.js:9650:3)
        at DelayedCommand.prototype.executeInternal_/h (file:///D:/Users/CAStone/AppData/Local/Temp/tmpkxv5zfva/extensio
ns/fxdriver@googlecode.com/components/command-processor.js:11635:16)
        at DelayedCommand.prototype.executeInternal_ (file:///D:/Users/CAStone/AppData/Local/Temp/tmpkxv5zfva/extensions
/fxdriver@googlecode.com/components/command-processor.js:11640:7)
        at DelayedCommand.prototype.execute/< (file:///D:/Users/CAStone/AppData/Local/Temp/tmpkxv5zfva/extensions/fxdriv
er@googlecode.com/components/command-processor.js:11582:5)

Что меня беспокоит, так это авто-спасение моего "selector":"//a[@href=\"/logout\"][contains(., \"Logout ?\")]" чик. Если он ищет точную строку \"/logout\" а также \"Logout ?\" тогда это явно не сработает.

2 ответа

Решение

Оказывается, вход в Джанго client класс, не повлияет селен. Таким образом, страница Selen видит не авторизован.

Причина, по которой мой шаг "Я вошел в систему" ​​не выполняется, заключается в том, что я не вошел в систему.

Я бы положился прямо на текст ссылки:

world.browser.find_element_by_link_text('Logout ?')

или же:

world.browser.find_element_by_partial_link_text('Logout')
Другие вопросы по тегам