Selenium не может найти элемент даже после явного ожидания на странице Ajax - PullRequest
0 голосов
/ 12 июня 2018

Я пытаюсь автоматизировать обновление полей в веб-приложении.Таким образом, URL не меняется после входа в систему

Вот мой код до сих пор

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

path_to_chromedriver = "C:/chromedriver"
browser = webdriver.Chrome(executable_path=path_to_chromedriver)

"""Login Page"""
login_url = "url"
browser.get(login_url)

username = browser.find_element_by_id("username")
password = browser.find_element_by_id("password")

username.send_keys("username")
password.send_keys("password")

browser.find_element_by_name("submit").click()

"""Application front page"""
searchBar = browser.find_element_by_id("searchBar")
searchBar.send_keys("item to be searched")

button = browser.find_element_by_id("searchButton")
button.click()

"""Click on item on search results"""
#starting here, everything doesn't work
wait = WebDriverWait(browser,10)
item = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#item')))
item.click()#this never works as it just times out

Этот сайт является веб-приложением.Я распечатал источник страницы после каждого клика, и он не меняется после домашней страницы, однако в браузере Chrome он меняется.Явные и неявные ожидания оба не работают.Любые предложения?

Заранее спасибо

- edit -

Я немного не решаюсь опубликовать HTML, потому что это пользовательское веб-приложение.Тем не менее, класс тела - «dhtmlx_winviewport», и часть веб-приложения, которая действительно изменилась, начинается с чего-то вроде

<iframe id = "frameID" name = "frame1" src="some link that shows the item I searched for" height="400" width="400" frameboorder="0" style="z-index: 10; position: absolute; visibility: visible; width:400px; height:800px;"> == $0

Я хочу нажать на ячейку в таблице * 1015.*

<td align="left" valign="middle" title="title">title</td>

Я получаю сообщение об ошибке:

Traceback (последний последний вызов): файл "C: \ script.py", строка 45, в item = wait.until (EC.presence_of_element_located ((By.CSS_SELECTOR, 'css'))) Файл "C: \ Users \ me \ AppData \ Local \ Programs \ Python \ Python36-32 \ lib \ site-packages \ selenium \ webdriver \ support \ wait \.py ", строка 80, до повышения TimeoutException (сообщение, экран, трассировка стека) selenium.common.exceptions.TimeoutException: Сообщение:

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Где находится экземпляр вашего объекта для Wait, не в этом блоке кода?Например, у меня -

self._wait = WebDriverWait(driver, 15)

Вы также можете попробовать использовать «элемент, который нужно кликнуть», а не «наличие обнаруженного элемента»

item = self._wait.until(EC.element_to_be_clickable((By.XPATH,"//MY_XPATH_IS_HERE")))

Получаете ли вы какие-либо сообщения об ошибках?Item == None возвращает true?

0 голосов
/ 12 июня 2018

Если ваше приложение использует JQuery для запроса Ajax, вы можете проверить, что JQuery.active равен нулю, прежде чем продолжить.Что-то вроде:

count = 0
while(count < max_secs):
    count += 1
    is_ajax_done = driver.execute_script("return window.JQuery != undefined && JQuery.active == 0")
    if is_ajax_done:
        # continue
    else:
        time.sleep(1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...