【发布时间】:2019-11-19 09:03:01
【问题描述】:
我正在尝试编写一个像这样工作的程序:
- 转到主页
- 单击列表中的第一项(所有项均以“item-”开头),进入下一页。
- 找到一个带有“A”的按钮并点击它。
- 找到一个“确认”按钮并点击它。
- 返回,对第 2 项、第 3 项等进行相同操作。
我有两个问题。首先,上面有“A”的按钮,有时比简单的“A”有更多的文字,例如。 “A”和“123”脚注。我对 HTML 不太了解,但这会导致不同的 span 和 div 类:
<div class="selectOne">
<span class="selectObject-no-footnote">A</span>
</div>
<div class="selectOne-with-footnote">
<span class="selectObject">A</span>
<span class="selectFootnote">
<span>123</span>
</span>
</div>
它们从不在同一个页面上,但在我的解决方案中,“A”按钮并不总是被按下。很难说是因为我的解决方案不正确还是来自第二个问题。通常(这是随机的)当我进入带有按钮的页面时,一些横幅从页面顶部滚落,整个网站以一种我的“确认”按钮看不见的方式移动。我解决它的方法是每次向下滚动网站,然后才开始寻找按钮。那么横幅是否滚下并不重要,因为在这两种情况下,按钮“A”和“确认”都是可见的。但是,我仍然没有 100% 的准确率,有时我会得到 click intercepted 异常。我的代码:
i=0
a=1
while True:
WebDriverWait(driver, 1).until(EC.element_to_be_clickable((By.XPATH, "//*[starts-with(@id, 'item-')]")))
items = driver.find_elements_by_xpath("//*[starts-with(@id, 'item-')]")
try:
items[i].click()
try:
try:
driver.execute_script("window.scrollTo(0, 250)")
WebDriverWait(driver, 1).until(EC.element_to_be_clickable((By.XPATH,"//span[@class='selectObject-no-footnote'][contains(text(),'A')]")))
driver.find_element_by_xpath("//span[@class='selectObject-no-footnote'][contains(text(),'A')]").click()
except Exception as e:
a = 0
print(e)
if a==0:
driver.execute_script("window.scrollTo(0, 250)")
WebDriverWait(driver, 1).until(EC.element_to_be_clickable((By.XPATH, "//span[@class='selectObject'][contains(text(),'A')]")))
driver.find_element_by_xpath("//span[@class='selectObject'][contains(text(),'A')]").click()
a=1
WebDriverWait(driver,1).until(EC.element_to_be_clickable((By.ID, 'confirm')))
driver.find_element_by_id('confirm').click()
except Exception as e:
print(e)
i += 1
driver.back()
except IndexError:
print(items)
print(i)
break
是否有其他工具可以做到这一点,而不必担心元素被某物覆盖或超出窗口? (废话?)
【问题讨论】:
标签: javascript python html selenium automation