Start Delete -6ren">
gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 17:20:45 25 4
gpt4 key购买 nike

我有以下页面布局:

<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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com