selenium.common.exceptions.NoSuchElementException: Сообщение: нет такой ошибки элемента при использовании ChromeDriver и Chrome через Selenium и Python - PullRequest
0 голосов
/ 02 мая 2019

Я создаю бота для регистрации учетных записей в Instagram, и когда я запускаю свой скрипт selenium локально (Mac OS), он отлично работает, в то время как при запуске в Ubuntu 18.4 в Azure Cloud он не работает с локализующими селекторами, поэтому практически я пытался все, от изменения xpath до ID и т. д.

from selenium import webdriver
from random import randint
import time
from selenium.webdriver.common.by import By
import accountInfoGenerator as account
from webdriver_manager.chrome import ChromeDriverManager
import random
import string
import os,sys
from selenium.webdriver.common.action_chains import ActionChains
from pyvirtualdisplay import Display


#!/usr/bin/env python

error = 'null'

##generator for random letters
def guess_letter():
    return random.choice('abcdefghijklmnopqrstuvwxyz')
##generator for random letters
def guess_number():
    return random.choice('1234567890')
#chooses PROXY AFTER EACH OTHER
def randomproxy():
    file = open("./proxy.txt")
    for line in file:
          fields = line.split(";")
    return random.choice(fields)



def insta():
    print("We are now using this proxy:" + randomproxy())

    while True:
        chrome_option = webdriver.ChromeOptions()
        chrome_option.add_argument('--proxy-server=%s' % randomproxy())
        # #hrome_option.add_argument('--headless') ,service_args=['--verbose', '--log-path=/tmp/chromedriver.log']
        display = Display(visible=0, size=(1024, 768))
        display.start()
        browser = webdriver.Chrome("./chromedriver",options=chrome_option)
        action_chains = ActionChains(browser)
        ##checks if theres internet
        def has_connection(browser):
            try:
                browser.find_element_by_xpath('//span[@jsselect="heading" and @jsvalues=".innerHTML:msg"]')
                return False
            except: return True

        browser.get("http://www.instagram.com")
        #if no internet then restart progras
        if not has_connection(browser):
            print('No Internet connection, aborted!')
            browser.quit()
            os.execv(sys.executable, ['python'] + sys.argv)


        time.sleep(5) #time.sleep count can be changed depending on the Internet speed.
        name = account.username()

        #Fill the email value
        email_field = browser.find_element_by_name('emailOrPhone')
        action_chains.move_to_element(email_field)
        email_field.send_keys(account.generatingEmail())
        time.sleep(3)
        print("We registered with email "+account.generatingEmail())
        #Fill the fullname value
        fullname_field = browser.find_element_by_name('fullName')
        action_chains.move_to_element(fullname_field)
        fullname_field.send_keys(account.generatingName())
        time.sleep(3)
        print("We registered with name" + account.generatingName())
        #Fill username value
        username_field = browser.find_element_by_name('username')
        name2 = (name + guess_letter() + guess_number())
        action_chains.move_to_element(username_field)
        time.sleep(3)
        username_field.send_keys(name2)
        print("We registered using this username" + name2 )
        #Fill password value
        password_field  = browser.find_element_by_name('password')
        action_chains.move_to_element(password_field)
        time.sleep(3)
        password_field.send_keys('aa12345bb12345cc'+name) #You can determine another password here.
        ##clicks button and checks if button was clicked due to lags
        time.sleep(6)

        button = browser.find_element_by_xpath('//div[7]/div/button')
        action_chains.move_to_element(button)
        button.submit()
        time.sleep(6)

        age_button = browser.find_element_by_id('igCoreRadioButtonageRadioabove_18')
        action_chains.move_to_element(age_button)
        age_button.click()
        time.sleep(3)


        next = browser.find_element_by_xpath('/html/body/div[3]/div/div[3]/div/button')
        next.click()
        time.sleep(10)
        print('Registering....')
        ##checks if error
        def has_error(browser):
            try:
                browser.find_element_by_class_name('Ma93n')
                return False
            except: return True
        #if error then restart
        if not has_error(browser):
            print('Error found! , aborted!')
            browser.quit()
            os.execv(sys.executable, ['python'] + sys.argv)
        #if sucessfully created and connection is alive then save credentials
        if has_error(browser):
            f = open('../instabot/examples/secret.txt','a')
            f.write( name + ':' + ('aa12345bb12345cc'+name) )
            f.close()
            print("Sucessfully saved")
            time.sleep(10)
            browser.close()




flag = True
while flag:
    insta()

Это вывод из консоли ssh

samih@app:~/instabotauto/autoaccount$ python botAccountCreate.py
We are now using this proxy:p.webshare.io:20192
We registered with email ytbygt@seznam.cz
We registered with nameBrandyn Ayana
We registered using this username.v.jkij2
Traceback (most recent call last):
  File "botAccountCreate.py", line 129, in <module>
    insta()
  File "botAccountCreate.py", line 94, in insta
    age_button = browser.find_element_by_id('igCoreRadioButtonageRadioabove_18')
  File "/home/samih/.local/lib/python2.7/site-packages/selenium/webdriver/remote/webdriver.py", line 360, in find_element_by_id
    return self.find_element(by=By.ID, value=id_)
  File "/home/samih/.local/lib/python2.7/site-packages/selenium/webdriver/remote/webdriver.py", line 978, in find_element
    'value': value})['value']
  File "/home/samih/.local/lib/python2.7/site-packages/selenium/webdriver/remote/webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "/home/samih/.local/lib/python2.7/site-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element:{"method":"id","selector":"igCoreRadioButtonageRadioabove_18"}
  (Session info: chrome=73.0.3683.86)
  (Driver info: chromedriver=2.35.528139 (47ead77cb35ad2a9a83248b292151462a66cd881),platform=Linux 4.18.0-1014-azure x86_64)

Программа должна создавать пользователей и сохранять их в файле .txt, который используется другой программой для входа в Instagram.

пока на mac консоль запускается без ошибок.

Checking for mac64 chromedriver:74.0.3729.6 in cache
Driver found in /Users/samihassan/.wdm/chromedriver/74.0.3729.6/mac64/chromedriver
We registered with email .skosr@seznam.cz
We registered with nameButali Zengin
We registered using this usernamefdzzicz2
Registering....

Checking for mac64 chromedriver:74.0.3729.6 in cache
Driver found in /Users/samihassan/.wdm/chromedriver/74.0.3729.6/mac64/chromedriver

1 Ответ

0 голосов
/ 03 мая 2019

Это сообщение об ошибке ...

selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element:{"method":"id","selector":"igCoreRadioButtonageRadioabove_18"}
  (Session info: chrome=73.0.3683.86)
  (Driver info: chromedriver=2.35.528139 (47ead77cb35ad2a9a83248b292151462a66cd881),platform=Linux 4.18.0-1014-azure x86_64)

... означает, что ChromeDriver не удалось найти нужный элемент и NoSuchElementException было поднято.

Вы можете найти подробное обсуждение NoSuchElementException в Selenium «selenium.common.exceptions.NoSuchElementException» при использовании Chrome

Однако ваша основная проблема заключается в несовместимость между используемой версией двоичных файлов:

  • Вы используете chromedriver = 2,35
  • Примечания к выпуску chromedriver = 2,35 четко упоминает следующее:

Поддержка Chrome v62-64

  • Вы используете chrome = 73.0
  • Примечания к выпуску ChromeDriver v2.46 четко упоминает следующее:

Поддерживает Chrome v71-73

Так что ясно, миразница между ChromeDriver v2.35 и Chrome Browser v73.0


Solution

Соответствующее обсуждение можно найти в selenium.common.exceptions.NoSuchElementException: Сообщение: нет такогоэлемент: невозможно найти элемент при попытке нажать кнопку «Далее» с селеном

...