Как найти элемент в (нет: идентификатор; нет: имя класса) для действия?

#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 может попробовать это и сообщить нам, сработало это или нет.