这是HTML。我想在这里使用动态xpath来获取头元素的文本。
<div class="w3-bar w3-theme w3-card-2 w3-wide notranslate">
<a class="w3-bar-item w3-button w3-hover-white w3-padding-16 hidesm" onclick="w3_open()" href="javascript:void(0)">
<a id="navbtn_tutorials" class="w3-bar-item w3-button barex w3-hover-white w3-padding-16" onclick="w3_open_nav('tutorials')" href="javascript:void(0)">
TUTORIALS
<i class="fa fa-caret-down"></i>
<i class="fa fa-caret-up" style="display:none"></i>
</a>
hElements = "//div[@class='w3-bar w3-theme w3-card-2 w3-wide notranslate']//a"
#is my xpath fetches all the header elements
hElementsSize = len(browser.driver.find_elements_by_xpath(hElements))
#fetches the size of the header elements
print("Total Header Elements:", hElementsSize)
hElementsText = browser.driver.find_element_by_xpath(hElements).text
print(hElementsText)
#i'm not able to get the text of the header elements
如果您想全部返回它们,假设您的xpath是正确的,则必须使用find_elements_by_xpath。然后它返回一个它找到的所有元素的列表。
hElementsText = browser.driver.find_elements_by_xpath(hElements)
for el in hElementsText:
print(el.text)
使用browser.driver.find_element_by_xpath
期望文本的方式将返回第一个元素的文本,该文本是空的,正如我在您共享的HTML中看到的那样。CCD_ 2在存在多个元素的情况下定位DOM中的第一个元素。
需要使用find_elements
并循环检查预期的一个
hElements = "//div[@class='w3-bar w3-theme w3-card-2 w3-wide notranslate']//a"
listOfElement = driver.find_elements_by_xpath(hElements)
print("Total Header Elements:", len(listOfElement))
for element in listOfElement:
print(element.text)
所需的元素是一个启用JavaScript的元素,因此要从元素中检索文本,您需要为visibility_of_element_located()
引入WebDriverWait,并且可以使用以下定位器策略之一:
-
使用
CSS_SELECTOR
和get_attribute()
方法:print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "div.w3-bar.w3-theme.w3-card-2.w3-wide.notranslate a#navbtn_tutorials"))).get_attribute("innerHTML"))
-
使用
XPATH
和文本属性:print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//div[@class='w3-bar w3-theme w3-card-2 w3-wide notranslate']//a[@id='navbtn_tutorials']"))).text)
-
注意:您必须添加以下导入:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC