контакты Google не работают с Python Selen Webdriver - PullRequest
0 голосов
/ 12 января 2019

Я взаимодействую с эффектом наведения питона селен впервые и столкнулся с проблемой.

Я хочу установить первый флажок контакта, видимый при наведении. Следующий код успешно пропускает строки раздела при наведении курсора и не отображает никаких ошибок, но:

  • Эффект наведения не виден
  • Эффект после наведения мыши, щелчок не работает и выход из блока кода

Я получаю печатное сообщение до Пересекается при наведении в try: block, и после этого я получаю Что-то пошло не так в исключении: block. Любые советы о том, что здесь не так, действительно приветствуются.

Примечание: - Ниже приведена часть кода, в которой я получаю ошибку.

...
import time
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions as EC
...

driver = webdriver.Chrome(webdriverpath)
driver.maximize_window()
driver.get('https://contacts.google.com')

wait20 = WebDriverWait(driver, 20)

def hover(browser, xpath):
    element = browser.find_element_by_xpath(xpath)
    hover = ActionChains(browser).move_to_element(element)
    hover.perform()
    time.sleep(1) 

try:
    print('Entered in try block')
    time.sleep(1)
    clink = wait20.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'div.ncJ6qe a')))
    clink.click()
    print('contact link clicked')

    time.sleep(3)
    cimg = driver.find_elements_by_xpath('//div[@class="XXcuqd" and contains(@style,"transform: translateY(0px)")]/div/div/div')
    print('cimg crossed')

    hover(driver, '//div[@class="XXcuqd" and contains(@style,"transform: translateY(0px)")]')
    print('hover crossed')

    cimg.click()
    print('contact image clicked successfully')

except:
    print('Semething went wrong.')

1 Ответ

0 голосов
/ 12 января 2019

Сначала попытайтесь не использовать широкую попытку / исключение.
Чтобы иметь возможность больше устранять неполадки в вашем коде, вы должны как минимум регистрировать исходную ошибку.

try:
    ..some code..
except Exception as e:
    print('Semething went wrong.')
    print("Caught Exception type {} with err.msg: {}".format(type(e), e))

Просматривая код, который вы используете:

find_element**s**_by_xpath

Какой селен вернет вам список элементов.

Либо измените код для использования одного элемента:

find_element_by_xpath

Или передайте индекс, который вам нужен при попытке нажать

Например, в вашем коде:

cimg = driver.find_elements_by_xpath('//div[@class="XXcuqd" and contains(@style,"transform: translateY(0px)")]/div/div/div')
print('cimg crossed')

hover(driver, '//div[@class="XXcuqd" and contains(@style,"transform: translateY(0px)")]')
print('hover crossed')

cimg[0].click()
print('contact image clicked successfully')

EDIT:
Я посмотрел на ваши xpaths, и они сбивают с толку и возвращают несколько элементов. Из вашего заявления print () я предполагаю, что вы хотите нажать на изображение контакта, чтобы включить флажок?

Если это так, вам не нужно наводить курсор на элемент, прежде чем щелкнуть по нему. Вы можете просто использовать JS-скрипт, чтобы щелкнуть по нему.

Я изменил ваш xpath с помощью css_selector и попробовал сам.

cimg = driver.find_elements_by_css_selector('.XXcuqd [role="checkbox"]')

Поскольку этот код возвращает список, не забудьте передать индекс контакта, по которому вы хотите щелкнуть.

В приведенном ниже случае я нажму первый, используя JS-скрипт:

driver.execute_script("arguments[0].click();", cimg[0])

Тогда ваш код может выглядеть так:

print('Entered in try block')
time.sleep(1)
clink = wait20.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'div.ncJ6qe a')))
clink.click()
print('contact link clicked')
time.sleep(3)
cimg = driver.find_elements_by_css_selector('.XXcuqd [role="checkbox"]')

print('cimg crossed')
driver.execute_script("arguments[0].click();", cimg[0])
print('contact image clicked successfully')

Дополнительно
Вы можете проверить, действительно ли установлен флажок, проверив атрибут:

if cimg[0].get_attribute('aria-checked') == 'true':
    print('contact image clicked successfully')
else:
    raise AttributeError("Fail to select the contact image")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...