栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

获取具有随机类名的元素

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

获取具有随机类名的元素

您当前正在通过硬编码的类名称搜索该元素。

如果类名是随机的,则不能再对其进行硬编码。您必须:

  • 通过其他特征 (例如,元素层次结构,某些其他属性等) 搜索元素 ; XPath可以做到这一点

    In [10]: driver.find_elements_by_xpath('//article//img')

    Out[10]:
    [,
    ,
    ]


    • 您还 可以按元素的 视觉特征进行 搜索:大小,可见性,位置。但是,这不能仅通过XPath来完成,您必须获取所有
      <img>
      标记并用手检查每个标记。
      (因为很长,请参见下面的示例。)
  • 从其他页面逻辑中以某种方式学习该类名 (如果页面的逻辑本身可以找到和使用它,则它必须存在于其他地方,并且该逻辑必须由其他东西找到,等等)

在这种情况下,类名是

renderImage
函数中局部变量的一部分,因此只能通过探索AST来通过DOM进行挽救。该函数本身埋在webpack机器内部的某个位置(它似乎将所有资源打包到几个带有一个字母名称的全局对象中)。或者,您可以将所有包含的JS文件作为原始数据读取,并
renderImage
在其中查找定义。因此,在这种情况下,尽管理论上仍然可行,但是这是不成比例的。


通过视觉特征获取元素的示例

无论在任何页面上,都
可以找到并排放置的3张相同大小的图像(这是它们在https://www.instagram.com/kitties上的显示方式)。

由于

HTMLElement
不能直接将s传递给Python(至少,我找不到任何方法),因此我们需要传递一些唯一的ID来代替它们,例如唯一的XPath。

(JS代码可能更优雅,我对此语言没有太多经验)

In [22]: script = """  //https://stackoverflow.com/questions/2661818/javascript-get-xpath-of-a-node/43688599#43688599  function getXPathForElement(element) {      const idx = (sib, name) => sib? idx(sib.previousElementSibling, name||sib.localName) + (sib.localName == name)          : 1;      const segs = elm => !elm || elm.nodeType !== 1? ['']          : elm.id && document.querySelector(`#${elm.id}`) === elm   ? [`id("${elm.id}")`]   : [...segs(elm.parentNode), `${elm.localName.toLowerCase()}[${idx(elm)}]`];      return segs(element).join('/');  }  //https://plainjs.com/javascript/styles/get-the-position-of-an-element-relative-to-the-document-24/  function offsetTop(el){    return window.pageYOffset + el.getBoundingClientRect().top;  }  var expected_images=3;  var found_groups=new Map();  for (e of document.getElementsByTagName('img')) {    let group_id = e.offsetWidth + "x" + e.offsetHeight;    if (!(found_groups.has(group_id))) found_groups.set(group_id,[]);    found_groups.get(group_id).push(e);  }  for ([k,v] of found_groups) {    if (v.length != expected_images) {found_groups.delete(k);continue;}    var offset_top = offsetTop(v[0]);    for (e of v){      let _c_oft = offsetTop(e);      if (_c_oft !== offset_top){        found_groups.delete(k);        break;      }    }  }  if (found_groups.size != 1) {    console.log(found_groups);    throw 'Unexpected pattern of images after filtering';  }  var found_group = found_groups.values().next().value;  result=[]  for (e of found_group) {    result.push(getXPathForElement(e));  }  return result;"""In [23]: d.execute_script(script)Out[23]:[u'id("react-root")/section[1]/main[1]/div[1]/article[1]/div[1]/div[1]/div[1]/div[1]/a[1]/div[1]/div[1]/img[1]', u'id("react-root")/section[1]/main[1]/div[1]/article[1]/div[1]/div[1]/div[1]/div[2]/a[1]/div[1]/div[1]/img[1]', u'id("react-root")/section[1]/main[1]/div[1]/article[1]/div[1]/div[1]/div[1]/div[3]/a[1]/div[1]/div[1]/img[1]']In [27]: [d.find_element_by_xpath(xp) for xp in _]Out[27]:[<selenium.webdriver.firefox.webelement.FirefoxWebElement (session="1ab4eeb4-10c4-4da4-996c-ee6744445dcc", element="55c48964-8cd0-4472-b35b-214a5a9bfbf7")>, <selenium.webdriver.firefox.webelement.FirefoxWebElement (session="1ab4eeb4-10c4-4da4-996c-ee6744445dcc", element="b7f7c8a4-e343-49ca-b416-49f72e67ae07")>, <selenium.webdriver.firefox.webelement.FirefoxWebElement (session="1ab4eeb4-10c4-4da4-996c-ee6744445dcc", element="728f6148-6a03-4c9a-9933-36859d65eb51")>]


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/639813.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号