python - 通过 Selenium 中的 xpath 变量查找并执行操作 - Python

标签 python html selenium xpath

我有以下页面布局:

<div class="x1">
    <button aria-expanded="false" class="button" data-toggle="dropdown" type="button">Actions<span class="caret"></span></button>
    <ul class="dropdown-menu" role="menu">
        <li>
            <a href="<my_link>/start">Start</a>
        </li>
        <li>
            <a data-target="delete" data-toggle="modal">Delete</a>
        </li>
        <li>
            <a href="<my_link>/auth">Authenticate</a>
        </li>
    </ul>
</div>

其中每一个都代表一个按钮(“操作”),单击该按钮时将在 Start 之间显示一个下拉菜单。 , Delete ,和Authenticate 。 我正在尝试使用 Selenium 从后端自动化我的页面测试和Python 。 这是我到目前为止所拥有的:

def scan_page(action):
    scan_url = urlparse.urljoin(self.base_url, "foo")
    self.driver.get(scan_url)
    elements = self.driver.find_elements_by_xpath("//div[@class='x1']")
    # loop over all the elements found by xpath
    for element in elements:
        element.click()
        ul = element.find_element_by_class_name("dropdown-menu")

        if action == "scan":
           if "Start" in ul.text:
              # start the action
              button = element.find_element_by_xpath("//button[@data-toggle='dropdown']")
              button.click()
      elif action == "delete":
           if "Delete" in ul.text:
              self.log.info("Deleting...")
     elif action == "auth":
           if "auth" in ul.text:
              self.log.info("Authenticating...")
     else:
        continue

该函数被赋予 action ,它定义了要做什么。如果"start"然后循环所有 elements然后单击Start选项。然而,它看起来并没有覆盖所有 buttons页面中定义,并且只有第一个button正在启动。因此,由于某种原因,Delete选项以某种方式被选择。

我做错了什么?

更新:

我添加了一个 JS Fiddle,以便人们可以玩它: http://jsfiddle.net/58rs3kuk/1/

最佳答案

我发现并修复了一些问题。我认为这应该有效,或者至少能让你走上正确的道路。

1) 您点击了不必要的容器DIV。它可能没有什么坏处,只是没有任何成效。

2) 仅当 action = "scan" 时,您才会点击 BUTTON。您希望对所有操作单击BUTTON,因此这些行需要在IF开始之前向上移动。因此...您将 1. 单击BUTTON,2. 确定请求的操作,以及 3. 执行该操作。

3) 您正在抓取 UL 来获取文本,但您想要的文本位于 LI 中(但在我进行更改后不需要)。

4) 我更改了一些变量的名称,使它们更容易识别,elements 现在是 buttonContainerselement 现在是 按钮容器。我建议您遵循这种做法,因为它将帮助您(和其他人)更轻松地调试代码。

5) 由于我们知道每个按钮中操作的顺序并且它们都是相同的,因此我们不必查找链接中的文本...我们只需按索引单击它们即可:0 表示开始, 1 表示删除,2 表示验证。

6) 如果传递了无效操作,则在日志中添加警告。您可能应该将其更改为异常或脚本中适当的任何内容。

7)修复了您发布的代码的缩进

def scan_page(action):
  scan_url = urlparse.urljoin(self.base_url, "foo")
  self.driver.get(scan_url)
  buttonContainers = self.driver.find_elements_by_xpath("//div[@class='x1']")
  # loop over all the buttonContainers
  for buttonContainer in buttonContainers:
    buttonContainer.find_element_by_tag_name("button").click()
    lis = buttonContainer.find_elements_by_tag_name("li")
    if action == "start":
      lis[0].click() # because we know the order of the actions and they are the same in each button, we can just click on them by index.
      self.log.info("Starting...")
    elif action == "delete":
      lis[1].click()
      self.log.info("Deleting...")
    elif action == "auth":
      lis[2].click()
      self.log.info("Authenticating...")
    else:
      self.log.info("WARNING: " + action + " is not a valid action.")
      continue

关于python - 通过 Selenium 中的 xpath 变量查找并执行操作 - Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33178856/

相关文章:

python - 在 keras 中制作自定义损失函数

html - 悬停时更改按钮内箭头的形状和颜色

javascript - 使用 javascript 更改跨度内容

ruby - 在 Ruby 测试单元中导入/读取参数

java - 当我尝试使用 Selenium 单击按钮时,为什么会出现 InvalidSelectorException?

java - 是否可以获取具有 WebElement 的 By 对象

python - Scrapy 错误 : exceptions. AttributeError: 'HtmlResponse' 对象没有属性 'urljoin'

python - python 的新 'pip wheel' 是否支持为 tests_requires 中列出的依赖项构建轮子?

python - Keras 中不同的输入/输出形状

javascript - 使用 jquery 设置输入数组值