Javascript XPath:DOM中缺少元素,但仍然存在,或者类似的东西
我尝试使用XPath检查(单击)此复选框,但到目前为止我的所有尝试都失败了,因为他们单击了图例中的链接(Lorem ipsum)Javascript XPath:DOM中缺少元素,但仍然存在,或者类似的东西,javascript,selenium,selenium-webdriver,xpath,webdriverwait,Javascript,Selenium,Selenium Webdriver,Xpath,Webdriverwait,我尝试使用XPath检查(单击)此复选框,但到目前为止我的所有尝试都失败了,因为他们单击了图例中的链接(Lorem ipsum) HTML来源: 如果我正确理解HTML(我可能不理解),他们不会使用HTML中内置的复选框功能,而是创建了一个CSS类,其中包含一个看起来像复选框的图形元素。现在,当我向使用这种样式的div发送一个单击时,单击的结果是div的文本内容,而不是复选框,然后单击在那里找到的链接 我理解得对吗?如何修复此问题/将单击指向正方形 编辑:此“对话框”中还有两个其他文
HTML来源:
如果我正确理解HTML(我可能不理解),他们不会使用HTML中内置的复选框功能,而是创建了一个CSS类,其中包含一个看起来像复选框的图形元素。现在,当我向使用这种样式的div发送一个单击时,单击的结果是div的文本内容,而不是复选框,然后单击在那里找到的链接 我理解得对吗?如何修复此问题/将单击指向正方形 编辑:此“对话框”中还有两个其他文本字段。我可以通过这两个XPath访问它们:
String xpText = "//input[@aria-label='text']";
String xpNumber = "//input[@aria-label='number']";
这三个元素都在同一个iframe
中。在执行这些步骤之前,我在主要内容
和不同的iFrame
之间执行了几次切换
标题2.2
位于上方HTML源代码屏幕截图顶部可见的
中,因此我非常确定我的框架/内容正确。此外,我可以访问文本中属于此复选框的链接
包括下面的整个对话框,以便更容易获得概述
//input[@aria label='Tick this box']
应该可以做到这一点。检查元素时,请确保使用的是HTML中突出显示的所需元素的行。如果不起作用,请确保复选框上没有Toclick()
,您可以使用以下任一选项:
- 使用
标记属性:driver.find_element_by_xpath("//label[@for='icon_prefix2_1']").click()
driver.find_element_by_xpath("//label[@class='leadform-checkbox'][.//p[contains(., 'Lorem ipsum dolor sit amet')]]//preceding::input[1]").click()
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//label[@for='icon_prefix2_1']"))).click()
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//label[@class='leadform-checkbox'][.//p[contains(., 'Lorem ipsum dolor sit amet')]]//preceding::input[1]"))).click()
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[@class='filled-in ng-untouched ng-pristine ng-invalid' and @aria-label='Acceptera villkor']"))).click()
- 使用
标记属性:driver.find_element_by_xpath("//label[@for='icon_prefix2_1']").click()
driver.find_element_by_xpath("//label[@class='leadform-checkbox'][.//p[contains(., 'Lorem ipsum dolor sit amet')]]//preceding::input[1]").click()
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//label[@for='icon_prefix2_1']"))).click()
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//label[@class='leadform-checkbox'][.//p[contains(., 'Lorem ipsum dolor sit amet')]]//preceding::input[1]"))).click()
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[@class='filled-in ng-untouched ng-pristine ng-invalid' and @aria-label='Acceptera villkor']"))).click()
- 使用
标记属性:driver.find_element_by_xpath("//input[@class='filled-in ng-untouched ng-pristine ng-invalid' and @aria-label='Acceptera villkor']").click()
理想情况下,要单击需要导入的元素,使
元素可单击()
,您可以使用以下任一选项:
- 使用
标记属性:driver.find_element_by_xpath("//label[@for='icon_prefix2_1']").click()
driver.find_element_by_xpath("//label[@class='leadform-checkbox'][.//p[contains(., 'Lorem ipsum dolor sit amet')]]//preceding::input[1]").click()
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//label[@for='icon_prefix2_1']"))).click()
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//label[@class='leadform-checkbox'][.//p[contains(., 'Lorem ipsum dolor sit amet')]]//preceding::input[1]"))).click()
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[@class='filled-in ng-untouched ng-pristine ng-invalid' and @aria-label='Acceptera villkor']"))).click()
- 使用
标记属性:driver.find_element_by_xpath("//label[@for='icon_prefix2_1']").click()
driver.find_element_by_xpath("//label[@class='leadform-checkbox'][.//p[contains(., 'Lorem ipsum dolor sit amet')]]//preceding::input[1]").click()
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//label[@for='icon_prefix2_1']"))).click()
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//label[@class='leadform-checkbox'][.//p[contains(., 'Lorem ipsum dolor sit amet')]]//preceding::input[1]"))).click()
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[@class='filled-in ng-untouched ng-pristine ng-invalid' and @aria-label='Acceptera villkor']"))).click()
- 使用
标记属性:driver.find_element_by_xpath("//label[@for='icon_prefix2_1']").click()
driver.find_element_by_xpath("//label[@class='leadform-checkbox'][.//p[contains(., 'Lorem ipsum dolor sit amet')]]//preceding::input[1]").click()
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//label[@for='icon_prefix2_1']"))).click()
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//label[@class='leadform-checkbox'][.//p[contains(., 'Lorem ipsum dolor sit amet')]]//preceding::input[1]"))).click()
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[@class='filled-in ng-untouched ng-pristine ng-invalid' and @aria-label='Acceptera villkor']"))).click()
- 注意:您必须添加以下导入:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC
@RichEdwards我试过点击它,但它只是返回org.openqa.selenium.elementnotinteractivatableexception:element notinteractivatable
@Bravo更新了源代码。是否有frame
或iframe
存在它看起来像是//input[@aria label=“Acceptera villkor”]
不起作用,已经试过了(我忘了在问题中包括这个)。返回org.openqa.selenium.elementnotinteractitableexception:element notinteractitable
@hensti,尝试定义是否有两个输入节点。或者试试XPATH(//input[@aria label='Tick this box'])[2]
只有一个,但是当我点击它时,它会点击文本中的链接,而不是复选框:-(奇怪的是,如果我使用上面评论中的XPATH,而不是发送click()
而不是发送isSelected()
我得到了正确的回答。不知何故,单击
似乎优先于复选框的文本链接。@hensti这很奇怪:)也许你应该尝试通过JavaScriptExecutor单击它?