即使在Ajax页面中显式等待之后,Selenium也找不到元素

时间:2018-06-11 21:13:05

标签: python ajax selenium selenium-webdriver selenium-chromedriver

我正在尝试自动更新Web应用程序中的字段。因此,登录后网址不会改变

到目前为止,这是我的代码

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浏览器中它确实发生了变化。显式和隐式等待都不起作用。有什么建议吗?

提前致谢

- 编辑 -

我发布html有点犹豫,因为它是一个自定义的网络应用程序。但是,正文的类是“dhtmlx_winviewport”,并且改变的Web应用程序的部分开始时类似于

<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

我要点击的是表格中的单元格

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

我得到的错误是

追踪(最近一次通话):   文件“C:\ script.py”,第45行,in     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 :(得分:0)

如果您的应用程序使用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)

答案 1 :(得分:0)

Wait的对象实例化在哪里,是不是在这段代码中? 例如我的是 -

self._wait = WebDriverWait(driver, 15)

您也可以尝试使用'元素可点击'而不是'元素存在'

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

您收到任何错误消息吗? item == None是否返回true?