【问题标题】:Selenium Automation Angular JS Button (Python) (Chrome)Selenium 自动化 Angular JS 按钮 (Python) (Chrome)
【发布时间】:2022-08-04 03:03:43
【问题描述】:

我正在尝试使网站自动化以自动制作用户配置文件。遇到了我无法选择的 NG 按钮。我尝试过 XPATH、CSS 和类名。这些似乎都不起作用。我不断收到“NoSuchElementException”:

By.XPATH, \'//button[normalize-space()=\"Create New User\"]\'

和

By.CSS_SELECTOR, \'.newUser.ng-scope\'

当我尝试使用 Webdriverwait 时,出现超时错误。

代码试验:

import time
from webbrowser import Chrome
from xml.etree.ElementPath import find

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

driver = webdriver.Chrome()
driver.get(\'https://power.dat.com\')

chrome_optinons = webdriver.ChromeOptions()
chrome_optinons.add_argument(\'--headless\')
chrome_optinons.add_argument(\'window-size=1920x1080\')

username = driver.find_element(By.XPATH, \'//*[@id=\"mat-input-1\"]\')
username.send_keys(\'\')

password = driver.find_element(By.XPATH, \'//*[@id=\"mat-input-0\"]\')
password.send_keys(\'\')

#(time.sleep(3))

loginbutton = driver.find_element(By.XPATH, \'//*[@id=\"submit-button\"]\')
loginbutton.click()

(time.sleep(5))

profiledrop = driver.find_element(By.XPATH, \'//*[@id=\"user-salutation\"]\')
profiledrop.click()

Adminbutton = driver.find_element(By.CSS_SELECTOR, \'#userPreferencesUl > li:nth-child(5) > a\')
Adminbutton.click()

# (time.sleep(10))

NewUsrBtn = driver.find_element(By.XPATH, \'//button[normalize-space()=\"Create New User\"]\')
NewUsrBtn.click()

#WebDriverWait(driver , 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, \'.newUser.ng-scope\'))).click()`

的HTML

<button class=\"newUser ng-scope\" type=\"button\" ng-if=\"isTrustedAdmin()\" ng-click=\"onNewUser();\" ng-disabled=\"user.isInEditMode\">
            Create New User
        </button>

如果需要,我还附上了更多 HTML 的屏幕截图

  • //button[text()=\"Create New User\"] is this working?
  • 不,我得到了 TimeOutException

标签: python selenium xpath css-selectors webdriverwait


【解决方案1】:

所需的元素是 Angular 元素,因此单击可点击您需要为element_to_be_clickable() 诱导WebDriverWait 的元素,您可以使用以下locator strategies 之一:

  • 使用CSS_SELECTOR:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button.newUser.ng-scope[ng-if^='isTrustedAdmin'][ng-click^='onNewUser']"))).click()
    
  • 使用路径:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//button[@class='newUser ng-scope' and contains(., 'Create New User')][starts-with(@ng-if, 'isTrustedAdmin') and starts-with(@ng-click, 'onNewUser')]"))).click()
    
  • 笔记:您必须添加以下导入:

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

更新

根据您在 cmets 中提供的 HTML 重新测试了 locator strategies,并且似乎可以正常工作。

【讨论】:

  • 当我使用您提供的代码使用 CSS 选择器或 Xpath 运行时,我仍然会收到 TimeOutException
  • 不知道这是否有所不同,但这是我手动单击按钮后按钮的 HTML:``` <button class="newUser ng-scope" type="button" ng-if="isTrustedAdmin() " ng-click="onNewUser();" ng-disabled="user.isInEditMode" disabled="disabled"> 创建新用户 </button> ``
  • 查看更新的答案并让我知道状态。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多