Нажатие конкретной кнопки с Selenium

Я пытаюсь нажать определенную кнопку с помощью Selenium в Python, но не могу определить эту конкретную кнопку. Например, если бы я был на странице Google это, и я хотел, чтобы панель перевода выпадала, как я могу ссылаться на этот конкретный элемент. Проверяя его в своем браузере, я вижу некоторые из того, что я считаю его данными, как:

    <div style="clear: both;" aria-controls="uid_0" aria-expanded="false"
     class="_LJ _qxg xpdarr _WGh vk_arc" data-fbevent="fastbutton" jsaction="kx.t;
 fastbutton: kx.t" role="button" tabindex="0" data-ved="0ahUKEwiwn-6K17XLAhVLWD4KHTk9CTkQmDMILzAA">

Однако с этого момента я не уверен, как бы я использовал функцию find по функциям, чтобы ссылаться на то, что мне нужно, чтобы правильно его вызвать.

driver.find_element_by_*("?").click()

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

#comment
print ("Let's talk about Python.")


driver = webdriver.Firefox()

driver.get("http://www.google.com")

assert "Google" in driver.title

elem = driver.find_element_by_name("q")

elem.send_keys("ignominious")
elem.send_keys(Keys.RETURN)

driver.find_element_by_*("?").click()


assert "No results found." not in driver.page_source

driver.close()

person TheOneTrueSign    schedule 10.03.2016    source источник


Ответы (3)


Вы можете использовать css_selector с атрибутом класса

driver.find_element_by_css_selector("._LJ._qxg.xpdarr._WGh.vk_arc").click()

Или class_name с любым из классов

driver.find_element_by_class_name("_LJ").click()
# or
driver.find_element_by_class_name("_qxg").click()
# or
driver.find_element_by_class_name("xpdarr").click()
# or
driver.find_element_by_class_name("_WGh").click()
# or
driver.find_element_by_class_name("vk_arc").click()

Отправка щелчка дочернему элементу также будет работать

driver.find_element_by_class_name("vk_ard").click()
person Guy    schedule 10.03.2016
comment
Эй, спасибо за ответ. Я пробовал это, но, похоже, это не сработало, я отредактирую свой пост, чтобы показать весь мой код на случай, если это что-то другое. - person TheOneTrueSign; 10.03.2016
comment
Да, ошибка, которую я получаю, слишком длинна для комментария, вот она: pastebin.com/07JRHd6W - person TheOneTrueSign; 10.03.2016
comment
@TheOneTrueSign Плохо, должно быть driver.find_element_by_class_name("_WGh") и driver.find_element_by_class_name("vk_arc"). Я исправил ответ и добавил еще один вариант - person Guy; 10.03.2016
comment
Спасибо, но, к сожалению, ни один из них не раскрывает вкладку перевода. Может ли проблема быть где-то еще в моем коде? - person TheOneTrueSign; 10.03.2016
comment
@TheOneTrueSign раньше ошибка заключалась в том, что вы не указали имя класса _WGh.vk_arc. Вы все еще пытаетесь driver.find_element_by_class_name("_WGh.vk_arc")? - person Guy; 10.03.2016
comment
Я переключил его на driver.find_element_by_class_name("_WGh").click() сейчас. - person TheOneTrueSign; 10.03.2016
comment
@TheOneTrueSign попробуйте добавить implicit_wait после создания нового драйвера driver.implicitly_wait(10) - person Guy; 10.03.2016
comment
Да! Это заставило его работать! В каких единицах 10 дюймов? Большое спасибо за проработку этого вместе со мной. - person TheOneTrueSign; 10.03.2016
comment
@TheOneTrueSign Это секунды. Он будет искать элементы до 10 секунд каждый раз, когда вы делаете driver.find_element(). Конечно, вы можете увеличить или уменьшить время. - person Guy; 10.03.2016

Для лучшей ремонтопригодности вы должны попробовать работать с идентификаторами.

В вашем примере селектор будет:

driver.find_element_by_css_selector("#uid_1 > div[role='button']").click()
person Florent B.    schedule 10.03.2016
comment
Спасибо за совет, однако мне кажется, что этот код не расширяет раскрывающийся список. Может быть, это проблема где-то еще в моем коде? - person TheOneTrueSign; 10.03.2016
comment
Извините за это, я взял неправильный идентификатор. Я обновил ответ. - person Florent B.; 10.03.2016
comment
Спасибо, это работает. Если позволите, я вижу, откуда вы взяли #uid_1 Но откуда вы взяли › div[role='button']. Является ли этот стандарт включенным после ввода идентификатора? - person TheOneTrueSign; 10.03.2016
comment
Я получил div[role='button'] из элемента, по которому должна щелкнуть мышь. Это селектор атрибутов (developer.mozilla.org/en/docs/Web/CSS /Attribute_selectors). И да, это обычная практика использовать комбинатор после идентификатора. - person Florent B.; 10.03.2016

Вы хотите нажать на стрелку. Если да, то ниже код работает для меня: -

    driver.manage().timeouts().implicitlyWait(50, TimeUnit.SECONDS);
    driver.get("https://www.google.com/");

    driver.findElement(By.name("q")).sendKeys("ignominious");
    driver.findElement(By.name("q")).sendKeys(Keys.RETURN);

    driver.findElement(By.className("vk_ard")).click();

Надеюсь, это поможет вам :)

person Shubham Jain    schedule 10.03.2016