Я хочу удалить все элементы из приложения, но у меня возникли проблемы с selenium python

#python #selenium #web-scraping

Вопрос:

Я хочу удалить все элементы из приложения, но у меня возникли проблемы с selenium python, это мой код :

 from selenium import webdriver
from selenium.webdriver.common import keys
import time

driver = webdriver.Chrome("path/to/chromedriver")
driver.get("https://web.whatsapp.com/")
time.sleep(10)
input("Qr Code: ")
driver.implicitly_wait(10)

numbers = driver.find_elements_by_class_name('_ccCW')
for n in numbers:
   print(n.text)
 

и мой сценарий очищает только 17 предметов, а у whatsapp есть 3 класса _ccCW FqYAR i0jNr , и в одном из каждого класса было 17 предметов, так как очистить эти три класса

Ответ №1:

к одному и тому же элементу WhatsApp можно получить доступ с помощью 2/3 разных xpath, поэтому использование одного xpath для элемента не всегда вернет текст.

некоторые расширения chrome помогут хорошо идентифицировать xpath. я использовал следующее расширение 4.

  1. Навигация по HTML DOM
  2. Истинный путь
  3. Помощник XPath
  4. Поиск XPath

ниже приведены основные элементы whatsapp

 chat_search_box = "/html/body/div[1]/div[1]/div[1]/div[3]/div/div[1]/div/label/div/div[2]"
selected_profile_header_name = "//HEADER[@class='_23P3O']//SPAN[@class='_ccCW FqYAR i0jNr']"
chat_name = "/html/body/div[1]/div[1]/div[1]/div[4]/div[1]/header/div[2]/div[1]/div/span"
footer = "/html/body/div[1]/div[1]/div[1]/div[4]/div[1]/footer/div[1]"
footer_textbox = "/html/body/div[1]/div[1]/div[1]/div[4]/div[1]/footer/div[1]/div[2]/div/div[1]/div/div[2]"
msg_nav_arrow = "/html/body/div[1]/div[1]/div[1]/div[4]/div[1]/div[3]/div/div[1]/span/div/span[2]"
 

ниже xpath указаны для доступа к имени чата в левой панели. они фиксированы, но номер div является динамическим. i = div # чат/группа

 pane_base = "(//div[@id='pane-side']//div[@class='_3OvU8'])"
pane_search_parent = lambda x : pane_base   "["   str(x)   "]"
pane_group_last_sender = lambda i: pane_search_parent(i)   "//span[@class='FqYAR i0jNr']"
pane_user_sms =  lambda i : pane_search_parent(i)   "//span[@class='_ccCW FqYAR i0jNr']"
pane_sms_date = lambda i: pane_search_parent(i)   "//div[@class='_3vPI2']/div[@class='_1i_wG']"
pane_notif = lambda i: pane_search_parent(i)   "//span[@class='_23LrM']"
pane_username = lambda i: pane_search_parent(i)   "//div[@class='zoWT4']"
 

для доступа к сообщению из чата сложнее всего, и одни и те же элементы имеют несколько xpath.

 msg_base = "(//div[@id='main']//div[@class='y8WcF']/div)[2]" #u have to change [2] with [n] to read specific msg

#u could find SENDER from any of 3 xpath depending on msg type.. sometime msg could be quoted text or first post or forwared msg or could be with image.
SENDER = [msg_base   "/div/div/div/div[1]/span[1]", msg_base   "//span[@class='a71At _3xSVM i0jNr']", msg_base   "//span[@class='_1BUvv']"]

#following item follows same as SENDER. please add 'msg_base' to each list items.
SENDER_NAME = ['/div/div/div/div[1]/span[2]']
SENDER_TEXT = ['/descendant::div/span/span[1]','//span[@class="i0jNr selectable-text copyable-text"]']
QUOTED_TEXT = ['/div/div/div/div[2]/div[1]/div/div/div/div/div[2]',"//span[@class='quoted-mention i0jNr']",'/div/div/div/div[1]/div[1]/div/div/div/div/div[2]']
QUOTED_SENDER = ['/div/div/div/div[2]/div[1]/div/div/div/div/div[1]/span[1]','/div/div/div/div[1]/div[1]/div/div/div/div/div[1]/span',"//span[@class='a71At i0jNr']"]
TIME = ["//span[@class='kOrB_']",'/descendant::div[last()]']
 

Пожалуйста, не стесняйтесь задавать любые вопросы о очистке WhatsApp с помощью python selenium

Ответ №2:

Если имена классов _ccCW , FqYAR , а i0jNr затем попробуйте

 classes_to_get = ["_ccCW", "FqYAR", "i0jNr"]

for kls in classes_to_get:
    numbers = driver.find_elements_by_class_name(kls)
    for n in numbers:
       print(n.text)
 

Ответ №3:

Попробуйте использовать этот xpath:

 //div[@role='gridcell']//span[@title]
 
 numbers = driver.find_elements_by_xpath("//div[@role='gridcell']//span[@title]")
for n in numbers:
   print(n.text)
   #print(n.get_attribute("innerText")) # You can also use this line to print the text.
 

Ответ №4:

Вы можете построить xpath со всеми 3 из них, как показано ниже :

 //*[contains(@class, '_ccCW') or contains(@class, 'FqYAR') or contains(@class, 'i0jNr')]
 

Код :

 numbers = driver.find_elements_by_xpath("//*[contains(@class, '_ccCW') or contains(@class, 'FqYAR') or contains(@class, 'i0jNr')]")
for n in numbers:
   print(n.text)