Python+Selenium селекторы


(Sckatik) #1

Добрый вечер!  Есть вот такой исходный код

<div>
        <div></div>
        <input></input>
        <span>
                <div>
<span>текст1</span>
</div>
                <div>
                        <input></input>
</div>
</span>
        <span>
                <div>
<span>test2</span>
</div>
<div>
                        <input></input>
</div>
</span>
        <span>
                <div>
<span>текст3</span>
</div>
                <div>
                        <input></input>
</div>
</span>
</div>
 

Нельзя использовать порядковые номер нод.

Тот инпут который помечен цветом нужно туда ввести какой то текст

Делаю так:

input=browser.find_element_by_xpath("//div/span[text()= 'test2']/div/input");
input.send_keys('Тест')

Не находит элемент. Если просто найти span то все ок находит. Но как достучатся до инпута?
Подскажите. Как правильней составить xpath.

 


(5am) #2

например так

//span[text()='test2']/../..//input

 

возможно есть более оптимальный вариант :)


(vmaximv) #3

1. //span[.//*[text()='test2']]//input

2. //*[./*/*[text()='test2']]//input

3. //span/div[contains(string(),'test2')]/following-sibling::*//input

4. //*[contains(string(),'test2')]/following-sibling::*/input

5. //*[contains(string(),'test2')]/following-sibling::*[1]//input

и т.д.

Последний вариант наиболее оптимален - будет подходить под многие контролы.


(Sckatik) #4

Спасибо за ответ. С этим заданием я разобрался. Но возник вопрос другого вида:

Нужно сделать метод,который бы ждал появления указанного элемента в течение заданного времени. Причём, при обнаружении объекта сразу же бы возращал True

Реализовал так:

from selenium.webdriver import Firefox
import time

browser = Firefox() #запускаем Firefox
browser.get('адрес нужного сайта') #загружаем страницу в Firefox
locator =browser.find_element_by_css_selector('input[id="loginName"]')

def is_element_present(self, *locator):
    self.selenium.implicitly_wait(10)
    try:
        self.selenium.find_element(*locator)
        return True
    except NoSuchElementException:
        return False
    finally:
        # set back to where you once belonged
        self.selenium.implicitly_wait(default_implicit_wait)

 

Все работает, если не находит элемент то выводит в интерпретаторе что не найден элемент, а как сделать чтобы выводилось слово False или True?

И правильно ли сделан метод. Может есть еще решение?


(Mykhailo Poliarush) #5

ну ровно для этих целей есть специальный класс с ожиданиями WebDriverWait

например, код может выглядеть так (насколько я понял вашу задачу)

 

 

from selenium.webdriver.support.ui import WebDriverWait

is_appeared = WebDriverWait(driver, 10).until(lambda x: x.find_element_by_id(“someId”).is_displayed())


(Sckatik) #6

Т.е если найдет нужный элемент то выдаст true если не найдет, то false?


(Mykhailo Poliarush) #7

да, потому что метод is_displayed() возвращает true или false