Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Не находит елемент (он вроде бы не в frame)

xpath
webdriver
Теги: #<Tag:0x00007f7b69976300> #<Tag:0x00007f7b69975d10>

(Hollmaro) #1

Ради практики решил потестить http://rozetka.com.ua/ua/. Подзкажите как найти елемент по xpath .//[@href=‘http://rozetka.com.ua/telefony-tv-i-ehlektronika/c4627949/’ and @name=‘fat_menu_link’] на сайте http://rozetka.com.ua/ua/ а после того как навести на него мишку перейти потом на .//[@href=‘http://rozetka.com.ua/mobile-phones/c80003/filter/’]. Если искать firepath’ом то все находит а если webdriver’ом то нет.


(Ярослав Бойко) #2

Можеш попробовать, сделать:

  1. Mouse over
xpath = (//a[@name='fat_menu_link'])[2]
  1. Wait to be clickable
xpath=  //*[@href='http://rozetka.com.ua/mobile-phones/c80003/filter/']
  1. Click
xpath = //*[@href='http://rozetka.com.ua/mobile-phones/c80003/filter/']

(Hollmaro) #3

Пробовал так, не находит всеравно

    Actions actions = new Actions(driver);
    WebDriverWait wait = new WebDriverWait(driver, 30);
    
    actions.moveToElement(button).click().build().perform();
    wait.until(ExpectedConditions.elementToBeClickable(mobile));

    actions.moveToElement(mobile).click().build().perform();
    wait.until(ExpectedConditions.elementToBeClickable(smartphones));

    actions.moveToElement(smartphones).click().build().perform();

(Misha Polunin) #4

Ребята, по той же теме хочу понять что я неправильно делаю.
Страница https://e.mail.ru/signup?from=navi&lang=ru_RU&siteid=169&rnd=890957663

Понимаю что неправильно прописываю путь к полю имя, посколько id и name при обновление страницы меняется, поэтому поле выбрать можно только по xpath.

я пишу так:
//div[contains(@class,‘firstname’)]//input

что не так?


(Crazyk2) #5

у меня по твоему локатору firepath корректно находит инпут элемент. может у тебя что-то другое?


(Misha Polunin) #6

пишу так:
from selenium import webdriver
from selenium.webdriver.common.keys import Keys

driver = webdriver.Firefox()
driver.get(“http://www.mail.ru”)
elem=driver.find_element_by_id(“PH_regLink”)
elem.send_keys(Keys.RETURN)
elem=driver.find_element_by_xpath("//div[contains(@class,‘firstname’)]//input")
elem.send_keys(“Misha”)
elem.send_keys(Keys.RETURN)


(Crazyk2) #7

А чего ты хочешь посылая elem.send_keys(Keys.RETURN)?
может просто сделать click()?

elem = driver.find_element_by_id("PH_regLink")
elem.click()

(Misha Polunin) #8

Класс Keys эмитирует команды клавиатуры RETURN, F1, ALT.
Вот и применил.
Я только учусь, и со многим разбираюсь.
Не спорю что легче через click().

Пока что остался на прежнем месте, проблема не решена.


(Taras) #9

не найдет он твой елемент, так как там список идет в <pseudo:before></pseudo:before> - ето псевдо елементи, вебдрайвер не работает с ними


(Misha Polunin) #10

Тарас, а как вы тогда поступил бы в таком случае?
Можно более развернутый ответ получить по поводу вашего комментария к моему коду?
Возможно можно импортировать нужный класс или библиотеку.

З.ы: с той же проблемой я сталкиваюсь в google когда хочу зарегистрироваться. Не находит элемент.


(ex3me0) #11

Элемент не находит, потому что его “нет”, для начала можно попробовать неявные ожидания (implicitly_wait).
Раз уж юзается селениум - то и действовать надо “как пользователь”, то бишь кликать по ссылке, а не ретьорн слать

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

driver = webdriver.Firefox()
driver.get("http://www.mail.ru")
driver.implicitly_wait(5)
elem=driver.find_element_by_id("PH_regLink")
elem.click()
elem=driver.find_element_by_xpath("//div[contains(@class,'firstname')]//input")
elem.send_keys("Misha")
elem.send_keys(Keys.RETURN)

(ex3me0) #12

@Roman_Lekh Следует посмотреть в сторону ActionChains


(Misha Polunin) #13

Спасибо вам за ответ!
Я так и подозревал что нужно implicitly_wait, только читать про него начал.

вы написали "для начала можно попробовать неявные ожидания " а если это вариант не подходит, что тогда?


(Denis Shameta) #14

//*[contains(@class,‘firstname’)]/span/input


(ex3me0) #15

Этот вариант подходит всегда, если элемент “когда-нибудь” появится на странице.
Другой вопрос - подходит ли такой “общий шаблон ожидания” под потребности проекта, если нет - используется по-элементная декомпозиция и явные ожидания конкретного элемента


(Taras) #16

посмотрел html инпектором на етой странице - елементи внутри ::before ::after блоков - почитайте что такое псевдо елементи


(Misha Polunin) #17

На Win 10
Тест не работает с командой driver.implicitly_wait(5), не находит элемент.
На win 7 тест работает.
Не подскажете в чем причина?


(ex3me0) #18

Возможно не успевает подгрузиться за 5 сек, тут хз, надо смотреть более глубоко, что происходит при фейле.
Я как раз проверял свой код на вин10 - все ок