Как получить доступ к «недоступному» полю ввода по селену в python (bet365) - PullRequest
0 голосов
/ 14 октября 2019

Чтобы создать инструмент для упрощения собственных спортивных ставок, я хотел бы автоматически заполнить ставку и нажать «сделать ставку». Я уже успел автоматически войти в систему, найти определенные совпадения / типы ставок и выбрать их.

Но теперь не работает тот же способ отправки, например, ключей в поле ввода в ставке (здесь это ставка),Пожалуйста, ознакомьтесь со следующими данными:

После того, как была выбрана любая ставка, отображается ставка

betslip

Проверка кода дает следующееинформация, отмеченная область - это место, где я ожидаю возможного взаимодействия

source code

Я испробовал все способы поиска элемента по идентификатору, по имени,селектором css, xpath и другими предоставленными именами в отмеченной области.

Не сработало: например,

driver.find_element_by_xpath("Stake") driver.find_element_by_class_name("stk bs-Stake_TextBox") driver.find_element_by_class_name("bs-Stake")

всегда выдает отладочную информацию: selenium.common.exceptions.NoSuchElementException: Сообщение: нет такого элемента: невозможно найти элемент

У кого-нибудь есть другая идея, как это можно сделать?

Большое спасибо

ОБНОВЛЕНИЕ (структура iFrame прилагается)

iframe

Ответы [ 2 ]

3 голосов
/ 14 октября 2019

Индуцировать WebDriverWait и frame_to_be_available_and_switch_to_it () Индуцировать WebDriverWait и element_to_be_clickable ()

WebDriverWait(driver,10).until(EC.frame_to_be_available_and_switch_to_it((By.NAME,"bsFrame")))
WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.XPATH,"//input[@placeholder='Stake']"))).send_keys("test")

Вам необходимо импортировать следующее.

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
1 голос
/ 14 октября 2019

Изменить для улучшения качества принятого ответа:

Если есть фрейм, сначала нужно переключиться туда. Также безопасный способ поиска динамически загружаемых элементов - использование «встроенного селена» ожидание условия .

Очень полезно определить функцию ...

from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait

# function to wait for element presence or interactibility
def wait_for_elem_by_xpath(xp, timer=10, clickable=False):
    # clickable flag adjusts if should the element be clickable
    # labels and such elements won't be clickable hence the default False
    if clickable:
        # wait for element to be clickable
        method = EC.element_to_be_clickable
    else:
        # wait for element presence
        method = EC.presence_of_element_located

    try:
        # wait until the element is found
        element = WebDriverWait(driver, timer).until(method((By.XPATH, xp)))
        return element
    except TimeoutException as ex:
        # if element is not found  in time, you can retry or return False 
        # or you can set a "negative" flag if you expect an element not to be found
        # or just...
        raise ex

Итак, позже вы можете:

# wait for iframe presence by element name
iframe = wait_for_elem_by_xpath('//*[@name="bsFrame"]')
# do the switch
driver.switch_to.frame(iframe)

# wait until input field interactible by xpath class name (since placeholder attribute) is dynamic based on interface language
# note the True flag -> instead of element presence, wait completes when the input field is ready to accept text
input_field = wait_for_elem_by_xpath('//input[@class="stk bs-Stake_TextBox"]', True)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...