Python:为什么selenium在angularJS站点上找不到元素?

2024-04-23 13:58:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试在此网站的搜索框中使用selenium: https://www.claytoncountyga.gov/government/sheriff/inmate-search

def clayton_search(last, first, middle):
    print("Clayton County Jail")
    url = "https://www.claytoncountyga.gov/government/sheriff/inmate-search"
    driver = webdriver.Chrome(chrome_options=(), executable_path="/usr/bin/chromedriver")
    driver.get(url)
    wait = WebDriverWait(driver, 30)
    wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "#name")))
    driver.find_element_by_css_selector("#name").send_keys(last," ",first, " ", middle, Keys.ENTER)    
    return driver

driver = clayton_search(last, first, middle)

这个站点使用angularJS,我知道在angularJS站点上selenium不会看到see元素,除非你告诉它等到元素可见。例如:

wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "#name")))

但我得到一个超时异常。我试着通过CSS选择器、XPATH和ID查找元素

即使堆栈跟踪没有表明它可能隐藏在另一个元素后面。我也试过用:driver.execute_script

我想导航栏的弹出菜单可能会覆盖它,但它只有在光标位于导航栏上时才会出现。你知道吗

为什么我不能使用wait.until(EC.visibility_of_element_located来定位这个AngularJS站点上的元素?你知道吗


Tags: ofname元素middlesearchdriverelementcss
2条回答

此页在iframe中有#name,而Selenium不在iframe中搜索。
您必须先switch_to.frame(),然后才能在iframe内搜索

import selenium.webdriver

url = "https://www.claytoncountyga.gov/government/sheriff/inmate-search"
driver = selenium.webdriver.Firefox()
driver.get(url)

iframes = driver.find_elements_by_tag_name('iframe')
#print('iframes:', iframes)

driver.switch_to.frame(iframes[0])

item = driver.find_element_by_id('name')
#print('name:', item)
item.send_keys("John")

item = driver.find_element_by_name('NameSearch')
#print('name:', item)
item.click()

有一个iframe阻止您访问元素。你呢必须切换iframe首先,试试看以下代码。你知道吗

def clayton_search(last, first, middle):
    print("Clayton County Jail")
    url = "https://www.claytoncountyga.gov/government/sheriff/inmate-search"
    driver = webdriver.Chrome(chrome_options=(), executable_path="/usr/bin/chromedriver")

    driver.get(url)
    wait = WebDriverWait(driver, 30)
    wait.until(EC.frame_to_be_available_and_switch_to_it((By.ID,"Clayton County")))
    wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "#name")))
    driver.find_element_by_css_selector("#name").send_keys(last," ",first, " ", middle, Keys.ENTER)
    return driver

相关问题 更多 >