python-3.x - selenium.common.exceptions.NoSuchElementException: Message: no such element error using ChromeDriver and Chrome through Selenium and Python
问题描述
我正在创建一个机器人来在 instagram 上注册帐户,当我在本地(Mac OS)运行我的 selenium 脚本时,它运行良好,而当我在 Azure Cloud 上的 Ubuntu 18.4 上运行时,它无法本地化选择器,所以实际上我已经尝试了从改变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)
该程序应该是创建用户并将其存储在其他程序用于登录 Instagram 的 .txt 文件中。
在 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
解决方案
此错误消息...
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。
使用 Chrome 时,您可以在Selenium “selenium.common.exceptions.NoSuchElementException”中找到关于NoSuchElementException的详细讨论
但是,您的主要问题是您使用的二进制文件版本之间的不兼容,如下所示:
- 您正在使用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之间存在明显的不匹配
解决方案
- 将ChromeDriver升级到当前的ChromeDriver v2.46级别。
- 将Chrome版本保持在Chrome v71-73级别之间。(根据 ChromeDriver v2.46 发行说明)
您可以在 selenium.common.exceptions.NoSuchElementException 中找到相关讨论:消息:没有这样的元素:尝试使用 selenium 单击下一步按钮时无法找到元素
推荐阅读
- css - CSS 在 Netsuite 高级 PDF 模板中为部分表头添加额外的字母间距
- jquery - 将搜索应用于多个列
- java - set 不包含等于其成员之一的项目?
- java - 对数组列表对象的值进行排序并在一个 lambda 中打印其中的多个
- c++ - 旧版 OpenGL 纹理无法正常工作
- javascript - 将 CheckBoxes 变成 CheckButtons
- python - 如何使用 Python Suds 客户端添加 XML 元素类型
- ruby-on-rails - 有没有办法在 Rails 4 项目中使用较新的 Rails 5 'rails db:migrate' 命令?
- javascript - Vue数据价值生命周期
- c# - Xamarin.Forms 应用上的 Android 的 Firebase 初始化失败