t.me/atinfo_chat Telegram группа по автоматизации тестирования

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

Теги: #<Tag:0x00007f9afaf3aab0> #<Tag:0x00007f9afaf3a9c0>

Ради практики решил потестить 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’ом то нет.

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

  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/']

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

    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();

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

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

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

что не так?

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

пишу так:
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)

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

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

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

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

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

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

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

Элемент не находит, потому что его “нет”, для начала можно попробовать неявные ожидания (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)
1 Симпатия

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

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

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

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

1 Симпатия

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

1 Симпатия

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

1 Симпатия

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

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