如何使用Selenium和Python 3.6在网页上定位元素

时间:2019-04-01 22:36:03

标签: python-3.x selenium xpath css-selectors webdriverwait

我正在尝试为selenium中的一个进程自动化准备python脚本。这是我第一次使用xpath,但我不知道为什么该xpath无法正常工作。

我从chrome webinspect(F12)获得它,然后单击文本框并复制为xpath:'/ html / body / div / form / div / div [5] / input [1]',但是python表示该程序找不到页面上的此类xpath,您能帮我吗?

我还认为python可能试图太快地检查此内容,因此我试图将其延迟到页面加载完毕但没有用时。

{{1}}

您能告诉我如何解决吗?

3 个答案:

答案 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