无法通过Python(selenium)在web中找到find_element

时间:2018-03-01 02:46:36

标签: python selenium

首先,对不起我的英语。我来自布宜诺斯艾利斯,几周前我就开始学习Python了。此外,我对编程有非常基本的了解。到目前为止我所能做到的只是从互联网上获取信息(在这件事上没有正式的教育 - 我去年正在研究会计)。

截至本文,我想在网页中找到一个元素,但我似乎无法做到正确。我甚至试图点击“空格”键 - 在这种情况下最简单的事情。

我想点击“确定”按钮。

我来自“Inspect element”:

<div class="alert" id="popup_content">
  <div id="popup_message">No Pending Documents</div>
  <div id="popup_panel">
    <input id="popup_ok" type="button" value="OK">
  </div>
</div>

print: 我试过这5个代码:

from selenium.webdriver.common.action_chains import ActionChains
element_ok = driver.find_element_by_xpath("//input[@id='popup_ok']")
Action.Chains(driver).move_to_element(element_ok).perform()
element.click()
driver.find_element_by_xpath(".//*[@id='popup_ok']/div/input").click()
driver.find_element_by_css_selector(".button_main[value='OK']").click()
clear_button = driver.find_element_by_xpath("//input[@id='popup_panel'][@type='button']")
clear_button = driver.find_element_by_xpath("//form[@id='popup_ok']/input[1]")
import keyboard
keyboard.press_and_release('shift+s, space')

有人会帮我解决这个问题吗?

PS:我正在使用硒(在“使用Python自动化无聊的东西。初学者的实用编程”一书中读到它。和chrome webdriver。

4 个答案:

答案 0 :(得分:0)

如果您知道元素的id,请尝试:

driver.find_element_by_id('popup_ok').click()

答案 1 :(得分:0)

有多种方法可以找到元素

<强> 1。按ID使用

ok_btn = driver.find_element_by_id("popup_ok")

<强> 2。使用xpath

ok_btn = driver.find_element_by_xpath("//input[@value='OK']")

OR

ok_btn = driver.find_element_by_xpath("//input[@id='popup_ok']")

答案 2 :(得分:0)

根据 HTML 您已共享点击按钮,文字为确定,您必须为元素引导 WebDriverWait 可点击,您可以使用以下代码行:

WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//div[@class='alert' and @id='popup_content']//div[@class='popup_panel']/input[@id='popup_ok' and @value='OK']"))).click()

答案 3 :(得分:0)

让我们来看看每种方法。

1

from selenium.webdriver.common.action_chains import ActionChains
element_ok = driver.find_element_by_xpath("//input[@id='popup_ok']")
Action.Chains(driver).move_to_element(element_ok).perform()
element.click()

这有两个问题。

首先,导入ActionChains,然后尝试将其用作Action.Chains。由于您没有导入任何名为Action的内容,因此您可能会看到此错误:

NameError: name 'Action' is not defined

删除多余的内部.应修复它:

ActionChains(driver).move_to_element(element_ok).perform()

其次,您找到该元素并将其保存到名为element_ok的变量中。然而,您尝试在名为click()的变量上调用element。因为您尚未使用该名称定义变量,所以您可能会看到此错误:

NameError: name 'element' is not defined

调用element_ok.click()应该修复它:

element_ok.click()

注意:您可能根本不需要使用ActionChains。如果元素位于视口之外,您应该只需要告诉Selenium移动到元素,例如“在首屏下方”:

element_ok = driver.find_element_by_xpath("//input[@id='popup_ok']")
element_ok.click()

2

driver.find_element_by_xpath(".//*[@id='popup_ok']/div/input").click()

此XPath查询告诉Selenium:

  1. 找到id "popup_ok"(A),
  2. 的元素
  3. 找到A的孩子<div>(B),
  4. 找到B的孩子<input>(C),然后
  5. return C。
  6. 这对您的HTML没有意义。 id "popup_ok"元素为<input>,既没有子<div>也没有孙<input>

    由于id "popup_ok"(A)的元素是您想要的<input> ,因此您只需删除XPath查询的其余部分:

    driver.find_element_by_xpath(".//*[@id='popup_ok']").click()
    

    3

    driver.find_element_by_css_selector(".button_main[value='OK']").click()
    

    此CSS选择器告诉Selenium查找并返回以下元素:

    1. 有班级button_main
    2. value "OK"(A)。
    3. 您的按钮符合要求2,但不符合1.它没有课程button_main。 (没有类button_main的元素。)

      相反,您可以使用*匹配任何元素,无论类名如何:

      driver.find_element_by_css_selector("*[value='OK']").click()
      

      但是,这不是一个很棒的CSS选择器。因为*匹配任何元素,所以它有可能变慢。

      相反,您可以通过标记进行匹配:

      driver.find_element_by_css_selector("input[value='OK']").click()
      

      4

      clear_button = driver.find_element_by_xpath("//input[@id='popup_panel'][@type='button']")
      clear_button = driver.find_element_by_xpath("//form[@id='popup_ok']/input[1]")
      

      第一个XPath查询告诉Selenium:

      1. 找到<input>元素 一个。有id "popup_panel"和 湾有type "button"
      2. 您的按钮符合要求1和1b,但不符合1a。祖父母id使用"popup_panel" <div>

        要解决此问题,您可以删除该要求:

        clear_button = driver.find_element_by_xpath("//input[@type='button']")
        

        第二个XPath查询告诉Selenium:

        1. 找到<form>元素(A) 一个。有id "popup_ok",然后是
        2. 找到A的第一个孩子<input>(B)。
        3. 您的按钮符合要求2,但不符合1.其父级既不是<form>标记,也不是id "popup_ok"

          相反, <input> 具有id

          clear_button = driver.find_element_by_xpath("//input[@id='popup_ok'][1]")
          

          注意:[1]选择第一个匹配的元素。由于id属性应该是唯一的,因此这是多余的,可以删除:

          clear_button = driver.find_element_by_xpath("//input[@id='popup_ok']")
          

          5

          import keyboard
          keyboard.press_and_release('shift+s, space')
          

          由于很多原因,这可能不起作用,这可能不值得进入。 Selenium能够模拟键盘事件,因此您可能不需要使用其他Python包。

          如果您有接收键盘事件的元素,可以在其上调用send_keys()

          from selenium.webdriver.common.keys import Keys
          
          element.send_keys(Keys.SPACE)
          

          如果您没有该元素,可以使用ActionChains将键盘事件发送到当前活动的元素:

          ActionChains(driver).send_keys(Keys.SPACE).perform()