XML-путь не найден в Selenium в пространстве имен — исчерпал все возможности

#python #html #selenium #selenium-webdriver #xpath

Вопрос:

Я работаю в рамках программы веб-тестирования:

 WebDriverWait(browser, 7).until(EC.element_to_be_clickable((By.XPATH, "*[@id="additionalTools"]/ul/li[3]/a""))).click()
 

и это не нахождение элемента. Все мои действия на сайте отлично работают с XPath.

HTML-код сайта является:

 <div xmlns: actutil = "xalan://mataf.portal.utils.UserAccountUtil" xmlns: wsgut = "xalan://mataf.portal.utils.GeneralUtils" xmlns: wsnls = "xalan://mataf.portal.utils.MatafEnvUtil" xmlns: wspuma = "xalan://mataf.portal.utils.PumaServices" xmlns: wsportal = "xalan://mataf.portal.utils.GeneratePortalLink" id = "T05CHEAD_global" >
<div id = "PRIMARY-TITLE" class = "heading plus" >
<h1 aria-hidden = "true" role = "document" aria-label = "על מנת להפוך את האתר לנגיש לקורא מסך לחץ alt   1. על מנת להפסיק הודעה זאת לחץ alt   2." >
<span id = "tabTitle" style = "float: right;" dir = "ltr" > תיק מט"ח < /span >
</h1 >
<div id = "additionalTools" class = "tools" >
<ul class = "fll" >
<li class = "first" >
<a id = "personalNavigationFavorite" class = "favorite" title = "הוסף למועדפים" href = "javascript:matafTools.processFavorite();" aria-label = "על מנת להפוך את האתר לנגיש לקורא מסך לחץ alt   1. על מנת להפסיק הודעה זאת לחץ alt   2." > </a >
</li >
<li class = "li-calc" >
<a href = "javascript:matafTools.openCalc();" class = "calc" title = "מחשבון" aria-label = "על מנת להפוך את האתר לנגיש לקורא מסך לחץ alt   1. על מנת להפסיק הודעה זאת לחץ alt   2." > </a >
</li >
<li class = "li-save" >
<a class = "save" title = "שמירה" href = "javascript:matafTools.processSaveAs('031','html','', 'true');" aria-label = "על מנת להפוך את האתר לנגיש לקורא מסך לחץ alt   1. על מנת להפסיק הודעה זאת לחץ alt   2." > </a >
 

Как я могу найти и click сохранить кнопку? Поиск по class , full XPath и name не работает.

Комментарии:

1. На какой тег вы хотите нажать ?

Ответ №1:

Вы используете неправильное выражение XPath.
Попробуйте это:

 WebDriverWait(browser, 7).until(EC.element_to_be_clickable((By.XPATH, "//div[@id='additionalTools']/ul/li[3]/a"))).click()
 

Или даже это:

 WebDriverWait(browser, 7).until(EC.element_to_be_clickable((By.XPATH, "//a[@class='save']"))).click()
 

Комментарии:

1. Спасибо, это работает. Почему мне нужен div вместо * поймать все?

2. Вы можете использовать * и там, но все равно ваш синтаксис был неправильным. Это может быть "//*[@id='additionalTools']/ul/li[3]/a"

3. Спасибо. Мне не хватало динамического корня с //?

4. ДА. Также избыточно " в конце

Ответ №2:

Вы поступаете неправильно в ожидании элемента, правильный синтаксис для явного ожидания в python таков :

 element = WebDriverWait(driver,7).until(EC.presence_of_element_located((By.XPATH, "xpath")))
 

Теперь вы можете сделать:

 element.click()
 

Для вашего случая:

 from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

element = WebDriverWait(driver,7).until(EC.element_to_be_clickable((By.XPATH, "myXpath")))

element.click();