Использование Selenium с Python в LinkedIn - PullRequest
0 голосов
/ 31 августа 2018

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

Linkedin использует динамические поля (ember), поэтому невозможно найти элементы по id. До сих пор я пробовал:

driver.find_elements_by_class_name("...").click()
driver.find_element_by_tag_name("button").click()
driver.find_element_by_css_selector("...").click()
driver.find_element_by_xpath(//...)

Это мой код:

def TextBot(browser):
time.sleep(3)
browser.get('https://www.linkedin.com/mynetwork/invite-connect/connections/')
time.sleep(3)
xpath = '//button[contains(@aria-label,"Send message to")]'
time.sleep(3)
buttons = driver.find_element_by_xpath(xpath)
for btn in buttons:
    print("Can %s" % btn.get_attribute("aria-label"))  

def Main():
#Parse enail and password to the script
parser = argparse.ArgumentParser()
parser.add_argument('email', help='linkedin email')
parser.add_argument('password', help='linkedin password')
args = parser.parse_args()

#browse to the login page
browser = webdriver.Firefox()
browser.get('https://linkedin.com/uas/login')

#Parse the two argument in the login form
emailElement = browser.find_element_by_id('session_key-login')
emailElement.send_keys(args.email)
passElement = browser.find_element_by_id('session_password-login')
passElement.send_keys(args.password)
passElement.submit()

#Initialise ViewBot function
os.system('clear') #cls rather than clear on windows
print ("[+] Success! Logged In, Bot Starting")
#ViewBot(browser)
TextBot(browser)
browser.close()

И моя ошибка:

Файл "LinkedInBot.py", строка 88, в TextBot button = driver.find_element_by_xpath (xpath) Файл "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/selenium/webdriver/remote/webdriver.py", строка 393, в find_element_by_xpath вернуть файл self.find_element (by = By.XPATH, value = xpath) "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/selenium/webdriver/remote/webdriver.py" , строка 966, в find_element 'value': value}) ['value'] Файл "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/selenium/webdriver/remote/webdriver.py", строка 320, в исполнении Файл self.error_handler.check_response (response) "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/selenium/webdriver/remote/errorhandler.py", строка 242, в check_response повысить исключение_класса (сообщение, экран, отслеживание стека) selenium.common.exceptions.NoSuchElementException: сообщение: невозможно элемент locate: // кнопка [содержит (@ aria-label, «Отправить сообщение»)]

Есть ли что-то еще, о чем я не думаю?

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

Ответы [ 2 ]

0 голосов
/ 01 сентября 2018

Код ниже прокрутите вниз, пока все контакты не будут загружены.
Затем получите все кнопки сообщений, щелкните, отправьте и закройте окно сообщения.

from selenium.webdriver.support import expected_conditions as EC
import re

#...

wait = WebDriverWait(driver, 20)
connectionsHeader = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, ".mn-connections__header h2"))).text
totalConnections = int(re.findall(r"\d+", connectionsHeader))
while len(driver.find_elements_by_css_selector(".mn-connections li")) < totalConnections-1:
    driver.execute_script("window.scrollTo(0, 100);")

messageButtons = driver.find_elements_by_css_selector(".mn-connections li button.mn-connection-card__message-btn")

for button in messageButtons:
    button.click()
    wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, ".msg-form__contenteditable"))).click()
    driver.find_elements_by_css_selector(".msg-form__contenteditable").send_keys('message')
    driver.find_elements_by_css_selector(".js-msg-close").click()
    wait.until(EC.invisibility_of_element_located((By.CSS_SELECTOR, ".js-msg-close")))

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

0 голосов
/ 01 сентября 2018

«Кнопка сообщения» в Linkedin выглядит следующим образом:

<button class="message-anywhere-button mn-connection-card__message-btn button-secondary-medium" aria-label="Send message to John Smith" data-ember-action="" data-ember-action-5128="5128">
  <span aria-hidden="true">Message</span>
  <span class="visually-hidden">
    Send a message to John Smith
  </span>
</button>

Так что для локатора у вас есть несколько вариантов, давайте остановимся на наиболее примитивном: ищите Send message to текст внутри aria-label:

xpath = '//button[contains(@aria-label,"Send message to")]'

Этот локатор найдет все кнопки. Но в зависимости от того, какую функцию вы вызываете, вы можете выбрать только первый элемент или все элементы. Допустим, цель состоит в том, чтобы собрать все кнопки:

xpath = '//button[contains(@aria-label,"Send message to")]'
all_message_buttons = driver.find_elements(By.XPATH, xpath)
for message_button in all_message_buttons:
    print("Can %s" % message_button.get_attribute("aria-label")) 
    # prints Can Send Message to John Smith
    # and any other names available on page

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

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# ...
xpath = '//button[contains(@aria-label,"Send message to")]'
wait = WebDriverWait(browser, 10) # wait for up to 10 sec
all_message_buttons = wait.until(EC.presence_of_element_located((By.XPATH, xpath)))
for message_button in all_message_buttons:
    print("Can %s" % message_button.get_attribute("aria-label")) 
    # prints Can Send Message to John Smith
    # and any other names available on page
...