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

ijnw1ujt  于 2022-11-24  发布在  其他
关注(0)|答案(6)|浏览(171)

我在中编写了一个脚本,为一些选定的用户在我的Firebase上进行一些webscraping。在访问某个用户的事件页面后,我想首先检查该用户是否没有记录任何事件。
为此,我使用了Selenium和Python。使用XPath似乎可以在脚本的所有其他部分找到链接和导航,除了访问表中的元素。起初,我想我可能使用了错误的XPath表达式,所以我直接从Chrome的检查窗口复制了路径,但仍然没有成功。
作为一种替代方法,我尝试复制页面源代码并将其传递到Beautiful Soup,然后在那里解析它以检查元素。
下面是一些代码,以及我正在尝试解析的一些HTML。我哪里出错了?

# Using WebDriver - always triggers an 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 expression directly. It is a bit risky, but it seems to have worked")
    else:
        print("didn’t find empty state")
except:
    print("could not find the empty state element", EC)

# Using Beautiful Soup
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”。

ccgok5k5

ccgok5k51#

请使用下列程式码:

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 不会生成或抛出任何异常

kkbh8khc

kkbh8khc2#

下面是我通常使用的方法。
进口

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
wpx232ag

wpx232ag3#

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

ruarlubt

ruarlubt4#

如果你正在使用Python和Selenium,你可以使用以下代码:

try:
    driver.find_element_by_xpath("<Full XPath expression>") # Test the element if exist
    # <Other code>
except:
    # <Run these if element doesn't exist>
k7fdbhmy

k7fdbhmy5#

我已经解决了这个问题。这个页面有很多不同的iframe元素,我不知道在Selenium中访问这些元素需要在框架之间切换。
初始代码没有任何错误,或者建议的解决方案在我测试时也工作得很好。
下面是我用来测试它的代码:

# Time for the page to load
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!")
y1aodyip

y1aodyip6#

使用 if 语句检查要检索的元素的长度,
示例:

element = ('https://www.example.com').
if len(element) > 1:
    # Do something.

相关问题