如何让 selenium 找到一个 Id 改变的元素
How do I make selenium find an element whos Id changes
所以我使用 selenium 和 运行 进行自动化,遇到这样一个问题:每次刷新页面时,元素 ID 都会发生变化,无论我是否复制 XPATH、CSS 选择器、ID,它们都是其中有一个数字会发生变化。
所以我使用的代码很简单,我只想点击我可以完成的按钮
browser.find_element(by=By.CSS_SELECTOR, value='*VALUE HERE*').click()
但我不知道该输入什么值。
这是 HTLM 代码
<a class="x4-tab x4-unselectable x4-box-item x4-tab-default x4-noicon x4-tab-noicon x4-tab-default-noicon x4-top x4-tab-top x4-tab-default-top x4-tab-after-title x4-active x4-tab-active x4-tab-default-active x4-top-active x4-tab-top-active x4-tab-default-top-active" hidefocus="on" unselectable="on" id="tab-1965" tabindex="0" data-ui-comp-name="wm-np-tab-wrkstn" style="right: auto; left: 66px; margin: 0px; top: 0px;">
<span id="tab-1965-btnWrap" role="presentation" class="x4-tab-wrap" unselectable="on">
<span id="tab-1965-btnEl" class="x4-tab-button" role="presentation">
<span id="tab-1965-btnInnerEl" class="x4-tab-inner x4-tab-inner-center"
unselectable="on">Workstations</span>
<span role="presentation" id="tab-1965-btnIconEl" class="x4-tab-icon-el " unselectable="on"
style="">
</span>
</span>
</span>
</a>
如果您查看 HTML,在您看到数字 1965 的任何地方,如果刷新页面,该数字将会改变。无论那个数字是多少,我如何让 selenium 找到这个元素?
此外,不确定这是否重要,但这全部在一个 iframe 中,我通过使用
获得了 selenium 目标
frame1 = browser.find_element(by=By.CLASS_NAME, value='defaultView')
browser.switch_to.frame(frame1)
此外,另一个问题是 HTML 代码与其他按钮几乎相同,按钮之间的唯一区别是数字(会改变)和“工作站”的位置。这是旁边的另一个按钮的示例,这个按钮用于服务器。
<span id="tab-1964-btnWrap" role="presentation" class="x4-tab-wrap" unselectable="on">
<span id="tab-1964-btnEl" class="x4-tab-button" role="presentation">
<span id="tab-1964-btnInnerEl" class="x4-tab-inner x4-tab-inner-center"
unselectable="on">Servers</span>
<span role="presentation" id="tab-1964-btnIconEl" class="x4-tab-icon-el"
unselectable="on" style="">
</span>
</span>
</span>
</a>
您可以为此使用 XPath:
browser.find_element(by=By.XPATH, value="//span[starts-with(@id, 'tab-') and contains(@id, '-btnEl')]").click()
所以我使用 selenium 和 运行 进行自动化,遇到这样一个问题:每次刷新页面时,元素 ID 都会发生变化,无论我是否复制 XPATH、CSS 选择器、ID,它们都是其中有一个数字会发生变化。
所以我使用的代码很简单,我只想点击我可以完成的按钮
browser.find_element(by=By.CSS_SELECTOR, value='*VALUE HERE*').click()
但我不知道该输入什么值。 这是 HTLM 代码
<a class="x4-tab x4-unselectable x4-box-item x4-tab-default x4-noicon x4-tab-noicon x4-tab-default-noicon x4-top x4-tab-top x4-tab-default-top x4-tab-after-title x4-active x4-tab-active x4-tab-default-active x4-top-active x4-tab-top-active x4-tab-default-top-active" hidefocus="on" unselectable="on" id="tab-1965" tabindex="0" data-ui-comp-name="wm-np-tab-wrkstn" style="right: auto; left: 66px; margin: 0px; top: 0px;">
<span id="tab-1965-btnWrap" role="presentation" class="x4-tab-wrap" unselectable="on">
<span id="tab-1965-btnEl" class="x4-tab-button" role="presentation">
<span id="tab-1965-btnInnerEl" class="x4-tab-inner x4-tab-inner-center"
unselectable="on">Workstations</span>
<span role="presentation" id="tab-1965-btnIconEl" class="x4-tab-icon-el " unselectable="on"
style="">
</span>
</span>
</span>
</a>
如果您查看 HTML,在您看到数字 1965 的任何地方,如果刷新页面,该数字将会改变。无论那个数字是多少,我如何让 selenium 找到这个元素?
此外,不确定这是否重要,但这全部在一个 iframe 中,我通过使用
获得了 selenium 目标frame1 = browser.find_element(by=By.CLASS_NAME, value='defaultView')
browser.switch_to.frame(frame1)
此外,另一个问题是 HTML 代码与其他按钮几乎相同,按钮之间的唯一区别是数字(会改变)和“工作站”的位置。这是旁边的另一个按钮的示例,这个按钮用于服务器。
<span id="tab-1964-btnWrap" role="presentation" class="x4-tab-wrap" unselectable="on">
<span id="tab-1964-btnEl" class="x4-tab-button" role="presentation">
<span id="tab-1964-btnInnerEl" class="x4-tab-inner x4-tab-inner-center"
unselectable="on">Servers</span>
<span role="presentation" id="tab-1964-btnIconEl" class="x4-tab-icon-el"
unselectable="on" style="">
</span>
</span>
</span>
</a>
您可以为此使用 XPath:
browser.find_element(by=By.XPATH, value="//span[starts-with(@id, 'tab-') and contains(@id, '-btnEl')]").click()