我正在使用selenium和python进行自动化测试,尝试单击Web中的元素时遇到问题。
我正在使用find_element_by_xpath,提供正确的路径(我在浏览器上进行过尝试,并且返回1之1)。
driver = webdriver.Chrome()
driver.get('page_url')
driver.find_element_by_xpath(//button[@class="aoc-end md-button md-ink-ripple"])
这是html:
<div class="_md md-open-menu-container md-whiteframe-z2 md-active md-clickable" id="menu_container_77" style="top: 499px; left: 866px; transform-origin: right top;" aria-hidden="false">
<md-menu-content class="agent-dropdown-menu-content new-menu-content" width="3" role="menu"><!----><md-menu-item>
<button class="aoc-end-work md-button md-ink-ripple" type="button" ng-transclude="" ng-disabled="!agent.capabilities.canSupervisorLogout" ng-click="logOutAgent(agent.userHandle)" role="menuitem">
应该找到该元素,但实际结果是selenium.common.exceptions.ElementNotVisibleException:消息:元素不可见
答案 0 :(得分:0)
在用角度开发的Web应用程序中查找定位器非常棘手,尤其是当开发人员没有遵循从自动化角度来看有用的任何准则时,例如为每个Web元素等添加唯一属性等等。
就您而言,似乎正在发生同一件事。
以下定位符应该为您工作(顺便说一句,您在driver.find_element_by_xpath()
方法中定位符前后缺少“”):
driver.find_element_by_xpath("//button[@ng-click='logOutAgent(agent.userHandle)']");
答案 1 :(得分:0)
从异常来看,该元素似乎在页面中存在,但当前不可见。 元素不可见的可能原因可能是(元素被另一个元素掩盖,元素可以在下拉列表中等)。如果元素在下拉列表中,则首先打开列表,然后找到该元素。
希望这会有所帮助。
答案 2 :(得分:0)
由于您要单击的元素是动态元素,因此需要先等待它变为可点击状态,然后才能单击它。使用预期条件并等待WebDriver:
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, 20).until(
EC.element_to_be_clickable((By.XPATH, "//button[@class='aoc-end md-button md-ink-ripple']"))).click()
此外,请注意外部和内部xpath选择器上的" "
和' '
引号。