Python/Selenium使脚本在输入失败时返回循环,然后重试



我编码了一个"bot";这触动了一个按钮——但事情并没有那么简单。

一旦机器人点击按钮,第二个按钮就会出现,机器人就会点击它,但随后计时器就会启动;第一个";按钮仍然存在,但不是第二个按钮(当计时器停止时,这个按钮将再次出现(。我希望代码继续执行单击两个按钮的过程,即使有计时器,并且程序找不到第二个按钮的路径。(代码循环返回,寻找第二个按钮,但没有找到,因此打印出一个错误:(

Traceback (most recent call last):
File "C:UsersfkahdPycharmProjectsbotbot.py", line 19, in <module>
submit2 = driver.find_element(By.XPATH, "/html/body/div[4]/div[6]/div/div/div[1]/div/form/button").click()
File "C:UsersfkahdPycharmProjectsbotvenvlibsite-packagesseleniumwebdriverremotewebdriver.py", line 1244, in find_element
return self.execute(Command.FIND_ELEMENT, {
File "C:UsersfkahdPycharmProjectsbotvenvlibsite-packagesseleniumwebdriverremotewebdriver.py", line 424, in execute
self.error_handler.check_response(response)
File "C:UsersfkahdPycharmProjectsbotvenvlibsite-packagesseleniumwebdriverremoteerrorhandler.py", line 247, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"/html/body/div[4]/div[6]/div/div/div[1]/div/form/button"}
(Session info: chrome=98.0.4758.82)
Stacktrace:
Backtrace:
Ordinal0 [0x01067AC3+2587331]
Ordinal0 [0x00FFADD1+2141649]
Ordinal0 [0x00EF3BB8+1063864]
Ordinal0 [0x00F201CE+1245646]
Ordinal0 [0x00F203CB+1246155]
Ordinal0 [0x00F4A612+1418770]
Ordinal0 [0x00F386D4+1345236]
Ordinal0 [0x00F48A0A+1411594]
Ordinal0 [0x00F384A6+1344678]
Ordinal0 [0x00F153F6+1201142]
Ordinal0 [0x00F162E6+1204966]
GetHandleVerifier [0x0120DF22+1680738]
GetHandleVerifier [0x012C0DBC+2413564]
GetHandleVerifier [0x010FD151+563089]
GetHandleVerifier [0x010FBF13+558419]
Ordinal0 [0x0100081E+2164766]
Ordinal0 [0x01005508+2184456]
Ordinal0 [0x01005650+2184784]
Ordinal0 [0x0100F5BC+2225596]
BaseThreadInitThunk [0x771FFA29+25]
RtlGetAppContainerNamedObjectPath [0x77357A9E+286]
RtlGetAppContainerNamedObjectPath [0x77357A6E+238]

Process finished with exit code 1

因此,我用try:except:编写了一个exeption,这样它就会返回主页,如果出现错误,就会导航回按钮,但代码会停止——但我希望它保持循环,继续尝试单击按钮。

如果你更高级,有没有办法读取计时器,并在计时器达到某个值后重试?计时器HTML:

<div id="c2VuZC9mb2xsb3dlcnNfdGlrdG9s">
<script type="text/javascript">
clearInterval(cltimer);
var et88e8a9cbc190762b = 420
function updatetimer() {
var ogqsbud75e2aaab9a29662 = Math.round((et88e8a9cbc190762b - 30)/60);
var lzrdp0381a = et88e8a9cbc190762b % 60;
if (lzrdp0381a < 10) {
lzrdp0381a = '0' + lzrdp0381a; 
}
$('#aqzcfpledc4ad').html('Please wait ' + ogqsbud75e2aaab9a29662 + ' minute(s) ' + lzrdp0381a + ' seconds for your next submit!');
if (et88e8a9cbc190762b <= 0) {
clearInterval(cltimer);
$('#aqzcfpledc4ad').html('Next Submit: READY....!');
} else {
et88e8a9cbc190762b--; 
}
}
var cltimer = setInterval('updatetimer()', 1000);
</script>
<h4 style="text-align:center;color:#337ab7;font-weight:bold;font-size:115%;" id="aqzcfpledc4ad">Please wait 6 minute(s) 53 seconds for your next submit!</h4></div>

这是我的代码:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time
link = 'xxx'
PATH = "C:Program Files (x86)chromedriver.exe"
driver = webdriver.Chrome(PATH)
driver.get("https://zefoy.com/")
time.sleep(5)
share = driver.find_element(By.XPATH, "/html/body/div[4]/div[1]/div[3]/div/div[5]/div/button").click()
paste = driver.find_element(By.XPATH, "/html/body/div[4]/div[6]/div/form/div/input")
paste.send_keys(link,Keys.RETURN)
submit = driver.find_element(By.XPATH, "/html/body/div[4]/div[6]/div/form/div/div/button").click()
time.sleep(1)
submit2 = driver.find_element(By.XPATH, "/html/body/div[4]/div[6]/div/div/div[1]/div/form/button").click()
try:
while True:
submit = driver.find_element(By.XPATH, "/html/body/div[4]/div[6]/div/form/div/div/button").click()
time.sleep(1)
submit2 = driver.find_element(By.XPATH, "/html/body/div[4]/div[6]/div/div/div[1]/div/form/button").click()
time.sleep(10)
except:
driver.back()
share = driver.find_element(By.XPATH, "/html/body/div[4]/div[1]/div[3]/div/div[5]/div/button").click()
paste = driver.find_element(By.XPATH, "/html/body/div[4]/div[6]/div/form/div/input")
paste.send_keys(link, Keys.RETURN)
#make code go back to loop

这是我找到的解决方案:阅读#了解更多解释

# import web interface modules:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import Select
# sleep module to make script wait while website loads
from time import sleep

# Link chromedriver to the script (chromedriver enables the interface)
PATH = "C:Program Files (x86)chromedriver.exe"
driver = webdriver.Chrome(PATH)
# get the website by the url
driver.get("https://zefoy.com/")
# take an input
vidUrl = input("url: ")
# I figured out that we can use a function as a loop
def loop1():
global i
sleep(10)
# I also used a try/except loop so the code doesn't exit and prints an error but continues on
try:
# There is a captcha at the beginning that the user has to solve
driver.find_element(By.XPATH, "/html/body/div[4]/div[1]/div[3]/div/div[5]/div/button").click()
except:
print("Solve Captcha!, Refreshing...")
driver.refresh() #refreshing if captcha doesn't get solved to avoid being stuck
loop1()
# Interacting with the web interface using another try/except loop
try: 
sleep(2)
driver.find_element(By.XPATH, "/html/body/div[4]/div[6]/div/form/div/input").send_keys(vidUrl)
sleep(1)
driver.find_element(By.XPATH, "/html/body/div[4]/div[6]/div/form/div/div/button").click()
sleep(1)
driver.find_element(By.XPATH, "/html/body/div[4]/div[6]/div/div/div[1]/div/form/button").click()
sleep(2)
driver.refresh()
i += 1
total = i * 500
print("Success delivered!")
sleep(5)
loop1()
except: 
# if the upper part fails then the script is going to execute this section
print("Timer still running, trying again in a minute")
# driver.refresh resets the web interface:
driver.refresh() 
sleep(5)
# we make the script refresh and wait for the page to load 
# loops brings the code back to the loop
loop1() 
# input to start the bot 
bot = int(input("Type 1 to startn"))

if bot == 1:
print('starting engine...')
loop1()
else:
print('error')

最新更新