如何使用Selenium XPath检查页面上是否存在元素?

问题描述 投票:0回答:4

我正在编写一个脚本,在我的Firebase上为少数精选用户进行网页编写。在访问用户的事件页面后,我想检查该用户之前没有记录任何事件的情况。

为此,我使用的是Selenium和Python。使用XPath似乎可以很好地在脚本的所有其他部分中定位链接和导航,除了访问表中的元素。起初,我可能一直在使用错误的Xpath,所以我直接从Chrome的检查窗口复制了路径 - 仍然没有运气。

作为替代方案,我试图复制页面源并将其传递给美丽的汤,然后在那里解析它以检查元素。也没有运气。

这是一些代码,以及我试图解析的一些HTML。我哪里错了?

# USING WEBDRIVER - ALWAYS TRIGGERS EXCEPTION 
def check_if_user_has_any_data():
try:
    time.sleep(10)
    element = WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located((By.XPATH, '//*[@id="event-table"]/div/div/div[2]/mobile-table/md-whiteframe/div[1]/ga-no-data-table/div')))
    print(type(element))
    if element == True:
        print("found empty state by copying xpath directly - bit risky, but it seems to have worked")
    else:
        print("did'nt find empty state")
except:
    print("could not find the empty state element", EC)


# USING BEAUTIFULSOUP
def check_if_user_has_any_data#2():
    time.sleep(10)
    html = driver.execute_script("return document.documentElement.outerHTML")
    soup = BeautifulSoup(html, 'html.parser')
    print(soup.text[:500])
    print(len(soup.findAll('div', {"class": "table-row-no-data ng-scope"})))


# HTML 
<div class="table-row-no-data ng-scope" ng-if="::config" ng-class="{overlay: config.isBuilderOpen()}">
  <div class="no-data-content layout-align-center-center layout-row" layout="row" layout-align="center center">
    ...
</div>

第一个版本触发异常。预计将'element'评估为True。实际,找不到元素。

第二个版本打印前500个字符(就我所知,正确),但返回'0'。检查页面源后,预计返回“1”。

python selenium web-scraping beautifulsoup selenium-chromedriver
4个回答
1
投票

使用以下代码:

elements = driver.find_elements_by_xpath("//*[@id='event-table']/div/div/div[2]/mobile-table/md-whiteframe/div[1]/ga-no-data-table/div")
size = len(elements)
if len(elements) > 0:
    #**element is present** do your action
else:
    #**element is not present** do alternative action 

注意:find_elements不会生成或抛出任何异常


1
投票

欢迎来到SO。这是我一般使用的方法。

进口

from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.by import By

方法

def is_element_present(self, how, what):
    try:
        self.driver.find_element(by=how, value=what)
    except NoSuchElementException as e:
        return False
    return True

0
投票

谢谢!

我已经解决了。该页面有一堆不同的iframe元素,我不知道必须在Selenium中的帧之间切换才能访问这些元素。

初始代码没有任何问题,或者建议的解决方案在我测试它们时也能正常工作。

(对不起,我意识到问题中没有足够的信息来确定这个问题)。

这是我用来测试它的代码:

# time for page to laod
    time.sleep(20)
    # Find all iframes
    iframes = driver.find_elements_by_tag_name("iframe")
    # From inspecting page source, it looks like the index for the relevant iframe is [0]
    x = len(iframes)
    print("Found ", x, " iFrames") # should return 5
    driver.switch_to.frame(iframes[0])
    print("switched to frame [0]")
    if WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located((By.XPATH, '//*[@class="no-data-title ng-binding"]'))):
        print("Found it in this frame!")

0
投票

有些东西是动态加载的,最好只是在等待异常上设置超时

© www.soinside.com 2019 - 2024. All rights reserved.