#python #python-3.x #selenium #iframe #captcha
Вопрос:
Я ищу элемент xpath <‘/html/body/div/div[2]’>, чтобы иметь возможность автоматически удерживать кнопку с помощью selenium python, однако у меня возникли трудности, так как они находятся внутри iframe. Я попробовал «Ожидаемые условия как EC», но я недостаточно осведомлен, чтобы заставить их работать. Скажите мне, что нужно изменить, или более разумный подход.
HTML:
<div id="px-captcha" role="main">
<iframe style="display: none; width: 310px; height: 100px; border: 0px; user-select: none;" token="951d7e81fd6fb5e2af2cb2c701dbb6c391ab81d4b983da5f2f2de85667241a43a3a814a87cae2e98c70b730f7eaaac0a04bbf77bbfc63735e436d1d07675cb68"></iframe>
<iframe style="display: block; width: 310px; height: 100px; border: 0; -moz-user-select: none; -khtml-user-select: none; -webkit-user-select: none; -ms-user-select: none; user-select: none;" token="951d7e81fd6fb5e2af2cb2c701dbb6c391ab81d4b983da5f2f2de85667241a43a3a814a87cae2e98c70b730f7eaaac0a04bbf77bbfc63735e436d1d07675cb68">
#document
<html lang="en-US"
<head>...</head>
<body>
<div id="kkBSsePnKDMVkwa" class="eIlUWbNLSMdFkEz">
<div id="#LrJbZYBfdAzlAkl"></div>
<div id="BlXIkuwFPcwvDCY" role="main" aria-label="Please press and hold the button until verified">...</div>
</div>
</body>
</html>
</iframe>
<iframe style="display: none; width: 310px; height: 100px; border: 0px; user-select: none;" token="951d7e81fd6fb5e2af2cb2c701dbb6c391ab81d4b983da5f2f2de85667241a43a3a814a87cae2e98c70b730f7eaaac0a04bbf77bbfc63735e436d1d07675cb68"></iframe>
<p style="color: red; margin-top: 4;">Please try again</p>
</div>
Код (обновлен)#Ошибка:
def captcha(url):
driver.get(str(url))
time.sleep(10)
try:
captcha_element = driver.find_element_by_id('px-captcha')
print(len(captcha_element.text), 'Captcha verification request page')
print('Run pass captcha programing')
# 2.1: Verify captcha
# Research iframe containing captcha
# # Example 2: Use pyautogui library
# driver.set_window_position(0, 0)
# driver.set_window_size(1024, 640)
# sleep(randint(5,10))
# pyautogui.moveTo(400, 438)
# pyautogui.click()
# pyautogui.dragTo(596, 438, 5, button='left')
# Example 3:
for i in range(10):
try:
wait = WebDriverWait(driver, 10)
wait.until(EC.frame_to_be_available_and_switch_to_it((By.XPATH, "(//div[@id='px-captcha']/iframe)[{i}]"))) #ERROR HERE. TO TRY REPLACEMENT <wait.until(EC.frame_to_be_available_and_switch_to_it((By.XPATH, "(//div[@id='px-captcha']/iframe)[2]")))>
print ("- Found iframe")
element = driver.find_element(By.XPATH, "//div[contains(@aria-label, 'Please press and hold the button until verified')]")
print ("- Found element")
# click and hold 5 seconds to pass the captcha
print("Button verify: ", len(element.text))
action = ActionChains(driver)
click = ActionChains(driver)
frame_x = element.location['x']
frame_y = element.location['y']
print("x: ", frame_x)
print("y: ", frame_y)
print("size box: ", element.size)
print("x max click: ", frame_x element.size['width'])
print("y max click: ", frame_y element.size['height'])
x_move = frame_x element.size['width']/2
y_move = frame_y element.size['height']/2
print("Click (x,y) = ", x_move, y_move)
action.move_to_element_with_offset(element, x_move, y_move).click_and_hold().perform()
time.sleep(10)
action.release(element)
action.perform()
time.sleep(0.2)
action.release(element)
print('Verify successful')
break
except:
print(f'- NOT Found xpath Num.: {i}')
sleep(randint(5,10))
except:
# 2.2: Skip captcha
print('Website does NOT require captcha verification')
sleep(randint(2,3))
Я хотел найти элемент:
<div id="BlXIkuwFPcwvDCY" role="main" aria-label="Please press and hold the button until verified">...</div>
Комментарии:
1. получить список номеров
iframes
по имени тега. Нравитсяdriver.findElements(By.tagName("iframe"));
и используйте конкретноеiframe
для переключения. Пожалуйста, дайте мне знать о результатах.2. <iframe_ele = captcha_element.find_elements_by_xpath(‘/iframe[‘ str(i) ‘]’)> к <iframe_ele = captcha_element.find_elements_by_xpath(‘/iframe[‘ str(i) ‘]’)> ИМЯ ТЕГА(‘iframe[‘ str(i) ‘]’))> Ошибка типа: объект ‘str’ не может быть вызван
Ответ №1:
Для взаимодействия с этим веб — элементом :
<div id="BlXIkuwFPcwvDCY" role="main" aria-label="Please press and hold the button until verified">...</div>
сначала вам нужно переключиться на этот iframe :
<iframe style="display: block; width: 310px; height: 100px; border: 0; -moz-user-select: none; -khtml-user-select: none; -webkit-user-select: none; -ms-user-select: none; user-select: none;" token="951d7e81fd6fb5e2af2cb2c701dbb6c391ab81d4b983da5f2f2de85667241a43a3a814a87cae2e98c70b730f7eaaac0a04bbf77bbfc63735e436d1d07675cb68">
Теперь, поскольку вы упомянули, что мы не можем найти какой-либо уникальный идентификатор для этого, я бы, вероятно, использовал его родительский div <div id="px-captcha" role="main">
Что-то вроде этого :-
wait = WebDriverWait(driver, 10)
wait.until(EC.frame_to_be_available_and_switch_to_it((By.XPATH, "(//div[@id='px-captcha']/iframe)[2]")))
а затем может взаимодействовать с нужным веб — элементом.
driver.find_element(By.XPATH, "//div[contains(@aria-label, 'Please press and hold the button until verified')]").click()
Вам также понадобятся следующие импортные товары :
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
Комментарии:
1. Обратная связь (последний последний вызов): строка 185 <модуль> подождите.пока(EC.frame_to_be_available_and_switch_to_it((По.XPATH, «//div[@id=’px-captcha’]/iframe[2]»)) Ошибка: «C:UsersPCAppDataRoamingPythonPython39site-packagesseleniumwebdriversupportwait.py», строка 80, в до тех пор, пока не вызовет исключение TimeoutException(сообщение, экран, трассировка стека) selenium.common.исключения. Исключение TimeoutException: Сообщение:
2. Моя командная строка остановлена командой, как указано выше. Кроме того, в моем html есть 10 похожих кадров, и элемент случайным образом находится в этих 10 кадрах после каждой загрузки страницы
3. Нажмите F12 в Chrome -> перейдите в раздел элементов ->> нажмите CTRL F ->>> затем вставьте и посмотрите>>>
//div[@id='px-captcha']/iframe[2]
, выделяется ли нужный элемент4. Попробуйте это
(//div[@id='px-captcha']/iframe)[2]
5. @NandanA : Я думаю, что этого должно хватить, спасибо, я должен был сначала применить индексацию xpath. Я обновил выше, OP может попробовать это и сообщить нам, сработало это или нет.