我正在尝试为selenium中的一个进程自动化准备python脚本。这是我第一次使用xpath,但我不知道为什么该xpath无法正常工作。
我从chrome webinspect(F12)获得它,然后单击文本框并复制为xpath:'/ html / body / div / form / div / div [5] / input [1]',但是python表示该程序找不到页面上的此类xpath,您能帮我吗?
我还认为python可能试图太快地检查此内容,因此我试图将其延迟到页面加载完毕但没有用时。
{{1}}
您能告诉我如何解决吗?
答案 0 :(得分:0)
您要做的就是等待用户名字段,然后与之交互。
driver = webdriver.Firefox(executable_path='C:\webdrive\geckodriver.exe')
url= "https://b2b-sso.bmw.com/login/login_b2b.fcc? TYPE=33619969&REALMOID=06-88882215-3ed6-4d48-a202-c1198bb66e4d&GUID=&SMAUTHREASON=0&METHOD=GET&SMAGENTNAME=$SM$fF%2fInZ1t%2b%2f1x7LPZ9ZpPr3Jmh3cKinaBuNkYKXWRFpXzW38w4hPWpxtCselZqile&TARGET=$SM$HTTPS%3a%2f%2fb2b%2ebmw%2ecom%2fgroup%2fb2b%3flang%3den"
driver.get(url)
userName = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//input[@name='USERNAME']")))
userName.send_keys("hello")
这是一般的xpath表示法。
//tag[@attribute='attribute_value']
如果要指定更多属性,请使用以下内容。
//tag[@attribtue1='attribute_value1' and @attribute2 = 'attribute_value2']
答案 1 :(得分:0)
我认为“复制Xpath”菜单不是一个好工具。实际上,您应该避免使用Xpath定位器,而只能将其用作最后的选择。您应该先检查:
1)如果元素具有id,name或className,则它是理想的定位器,因此您可以直接访问该元素
2)如果可以,请使用CSS定位器
3)只有这样,您才应该使用xpath定位器。
xpath是一个非常弱的定位器,好像明天前端开发人员更改网页并将一些标头放在用户名字段(您要访问的那个)上方,即您找到的Xpath“ / html / body / div / form / div / div [5] / input [1]“将更改,您的代码将中断。
现在,如果您直接访问元素:
<input onkeypress="return Kernel.submitFormOnEnter(event)" tabindex="1" class="loginField loginFieldUser" name="USERNAME" size="13">
name =“ USERNAME”
开发人员可以将输入移动到页面中的任何位置,您的测试仍将找到该元素并且不会中断。
因此,只需使用:driver.find_element_by_name(“ USERNAME”);查找元素。
有更好的方法来执行此操作(页面对象模型),但是目前为止,因为您正在学习这种方法就可以了。
祝你好运!
答案 2 :(得分:0)
从您的代码试用版/html/body/div/form/div/div[5]/input[1]
看来,您正在尝试定位<input>
标签,该标签与该元素相邻,且文本为 Username 。要将字符序列发送到所需字段,您需要诱导 WebDriverWait ,以使所需元素可点击,并且您可以使用以下任一方法以下Locator Strategies:
使用CSS_SELECTOR
:
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input.loginField.loginFieldUser[name='USERNAME']"))).send_keys("mikzielinski")
使用XPATH
:
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[@class='loginField loginFieldUser' and @name='USERNAME']"))).send_keys("mikzielinski")
注意:您必须添加以下导入:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC