首先,对不起我的英语。我来自布宜诺斯艾利斯,几周前我就开始学习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。答案 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)
让我们来看看每种方法。
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()
driver.find_element_by_xpath(".//*[@id='popup_ok']/div/input").click()
此XPath查询告诉Selenium:
id
"popup_ok"
(A),<div>
(B),<input>
(C),然后这对您的HTML没有意义。 id
"popup_ok"
元素为<input>
,既没有子<div>
也没有孙<input>
。
由于id
"popup_ok"
(A)的元素是您想要的<input>
,因此您只需删除XPath查询的其余部分:
driver.find_element_by_xpath(".//*[@id='popup_ok']").click()
driver.find_element_by_css_selector(".button_main[value='OK']").click()
此CSS选择器告诉Selenium查找并返回以下元素:
button_main
和 value
"OK"
(A)。您的按钮符合要求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()
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:
<input>
元素
一个。有id
"popup_panel"
和
湾有type
"button"
。您的按钮符合要求1和1b,但不符合1a。祖父母id
使用"popup_panel"
<div>
。
要解决此问题,您可以删除该要求:
clear_button = driver.find_element_by_xpath("//input[@type='button']")
第二个XPath查询告诉Selenium:
<form>
元素(A)
一个。有id
"popup_ok"
,然后是<input>
(B)。您的按钮符合要求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']")
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()