элемент не виден, несмотря на наличие в документе в Python Selen - PullRequest
0 голосов
/ 15 февраля 2019

Ссылка на страницу: https://contacts.google.com/u/1/?pageId=none

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

Проблема: Ошибка получения элемент не виден в svgicon.click().Хотя элемент явно доступен в видимом DOM согласно приложенному изображению.

Наблюдение: Я заметил, что если мы вручную нажимаем на значок каретки, то HTML-код DropDown вставляется через JavaScript и на любойдругое нажатие тела приводит к удалению html-кода DropDown.

Я знаю, что следующее утверждение кода, используемое для достижения желаемого, является правильным и работает, но не заполняет DropDown.Любая помощь очень ценится.

//find & click on SVG icon

svgicon = driver.find_element_by_css_selector('div.PFdmz .uzHa0d .RANAid[role="button"]')
svgicon.click()

//click on all link post dropdown appears
wait5.until(EC.presence_of_element_located((By.XPATH, '//div[@class = "jO7h3c" and text() = "All"]'))).click()

DOM Image

DOM Image

РЕДАКТИРОВАТЬ 1 -Пример усилий Javascript для выбора всех флажков

t=0
for _ in range(len(driver.find_elements_by_css_selector('.XXcuqd div[role="checkbox"]'))):
    cimgs = driver.find_elements_by_css_selector('.XXcuqd div[role="checkbox"]')
    ActionChains(driver).move_to_element(cimgs[t]).perform()
    driver.execute_script("arguments[0].click();", cimgs[t])
    t = t+1

, если каким-либо образом мы сможем использовать этот метод для сокращения времени, необходимого для отметки всех отмеченных флажков (за один раз вместо использования Actionchains), тогда это решит проблемутоже.В любой момент времени у меня будет 10000+ контактов для этого занятия.

Ответы [ 4 ]

0 голосов
/ 26 февраля 2019

Что ж, после того, как мы потратили более 15 дней на исследования, обучение и помощь сообщества, ничего не сработало, как ожидалось, поэтому мне пришлось перейти на 2-й вариант (нежелательно) для достижения цели.

Рабочий ответ

# get total contacts count from left side menu displayed number
totalcount = driver.find_element_by_css_selector('span.jlpDMe[dir="ltr"]').get_attribute('innerHTML')
time.sleep(1)
cimg = driver.find_elements_by_css_selector('div.XXcuqd div[role="checkbox"]')
#t=1 because **div[data-tooltip='Selection actions']** is also a checkbox & we don't want that to be a part of loop
t=1 
while t < int(totalcount)+1:
    driver.execute_script("arguments[0].click();", cimg[t])
    t+= 1

Этот метод намного быстрее, чем использование Actionchains , который я показал в РЕДАКТИРОВАТЬ 1 - Пример Javascript для выбора всех флажков .

В любом случае, спасибо всем за то, что вы решили решить головоломку, хотя для меня она все еще остается загадкой.Но, учитывая количество усилий, приложенных всеми, владелец награды @ Dan-Dev.Спасибо @ Dan-Dev и продолжай помогать таким, как мы.

0 голосов
/ 26 февраля 2019

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

svgicon = driver.find_element_by_css_selector('div.PFdmz .uzHa0d 
.RANAid[role="button"]')

селектор соответствует четырем элементам, а флажок, который вы ищете, является четвертым.Если вы этого еще не сделали, попробуйте вместо этой строки

svgicon = driver.find_elements_by_css_selector('div.PFdmz .uzHa0d 
.RANAid[role="button"]')[3]

.

Я сразу же уверен в исполнителе JS, но мог бы взглянуть, если приведенный выше код неработа.

0 голосов
/ 26 февраля 2019

Я не знаю почему, но Код Dan-dev дает нужный вам результат, я пробовал его, и он отлично работает для меня.В этом случае я просто добавлю другую альтернативу тому, что я делал раньше, когда столкнулся с такой же проблемой, как ваша, которая может как-то сработать для вас.Вот мой код:

from selenium.webdriver.support.ui import Select


#From Dan-dev's code
svgicon = driver.find_element_by_css_selector("div[data-tooltip='Selection 
actions']")
ActionChains(driver).move_to_element(svgicon).double_click().perform()

#Alternative/Optional Solution
driver.execute_script("return arguments[0].removeAttribute('style');", svgicon)
selectall = Select(svgicon)

for option in selectall.options:
 selectall.select_by_visible_text('All')
0 голосов
/ 17 февраля 2019

По какой-то причине вам нужно дважды щелкнуть значок:

import selenium
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
import time

driver=webdriver.Firefox()
# Log into Google.
url = "https://accounts.google.com/signin/v2/identifier?hl=en&passive=true&continue=https%3A%2F%2Fwww.google.com%2F&flowName=GlifWebSignIn&flowEntry=ServiceLogin"
driver.get(url)
time.sleep(1)
username = driver.find_element_by_id('identifierId')
username.send_keys("REDACTED")
time.sleep(1)
driver.find_element_by_id('identifierNext').click()
time.sleep(1)
password = driver.find_element_by_name('password')
password.send_keys("REDACTED")
time.sleep(1)
driver.find_element_by_id('passwordNext').click()
time.sleep(1)

url="https://contacts.google.com/"
driver.get(url)
time.sleep(1)
# Select the first contact and click on it to open the desired menu.
contact = driver.find_element_by_css_selector("div[role='checkbox']")
contact.click()
time.sleep(1)
# Double click the selected action icon to open menu.
svgicon = driver.find_element_by_css_selector("div[data-tooltip='Selection actions']")
ActionChains(driver).move_to_element(svgicon).double_click().perform()
time.sleep(1)
# Click the "All" button.
selectall = driver.find_element_by_xpath("//*/div[text()='All']")
selectall.click()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...