我找不到带有硒的输入字段,因为页面是动态的,页面更新时值会发生变化 下面是一个例子:
<jn-form-typeahead-occupations _ngcontent-ciw-c201="" placeholder="Fx byggeri, transport" label="Stilling eller arbejdsområde" _nghost-ciw-c169=""><div _ngcontent-ciw-c169="" class="ng-untouched ng-pristine ng-invalid"><label _ngcontent-ciw-c169="" class="block full-width margin-bottom-quart required" for="19b3-71ca">Stilling eller arbejdsområde</label><jn-typeahead-reactive-occupations _ngcontent-ciw-c169="" class="block full-width ng-untouched ng-pristine ng-invalid" _nghost-ciw-c168=""><input _ngcontent-ciw-c168="" autocomplete="off" type="text" class="block full-width" id="19b3-71ca" placeholder="Fx byggeri, transport"><!----></jn-typeahead-reactive-occupations><jn-form-control-validator _ngcontent-ciw-c169="" class="block full-width margin-top-half" _nghost-ciw-c154=""><!----></jn-form-control-validator></div></jn-form-typeahead-occupations>
更新时:
<jn-form-typeahead-occupations _ngcontent-asn-c201="" placeholder="Fx byggeri, transport" label="Stilling eller arbejdsområde" _nghost-asn-c169=""><div _ngcontent-asn-c169="" class="ng-untouched ng-pristine ng-invalid"><label _ngcontent-asn-c169="" class="block full-width margin-bottom-quart required" for="83da-33ab">Stilling eller arbejdsområde</label><jn-typeahead-reactive-occupations _ngcontent-asn-c169="" class="block full-width ng-untouched ng-pristine ng-invalid" _nghost-asn-c168=""><input _ngcontent-asn-c168="" autocomplete="off" type="text" class="block full-width" id="83da-33ab" placeholder="Fx byggeri, transport"><!----></jn-typeahead-reactive-occupations><jn-form-control-validator _ngcontent-asn-c169="" class="block full-width margin-top-half" _nghost-asn-c154=""><!----></jn-form-control-validator></div></jn-form-typeahead-occupations>
我注意到"c168"是唯一的,而"jn-typeahead-reactive-occupations"是唯一的,但我不知道如何选择输入字段并发送密钥。 以下是我尝试过的一些事情的几个例子: browser.find_element_by_xpath("//input[contains(text((, 'c168'(]"(.send.keys('hello'(
browser.find_element_by_xpath("[contains('c168'(]/input"(.send.keys('hello'(
browser.find_element_by_tag_name("jn-typeahead-reactive-occupations" and css_selector("input"((.send.keys('hello'(
- 页面结构可能会改变,例如添加一些额外的"div"或将"div"更改为"span"等。
- 准备较短的更容易。
您应该使用较短的定位器,例如:
//*[label(text() = 'Stilling eller arbejdsområde')]/input
它的意思是"找到一个带有标签'位置或工作区'的 Web 元素并接受它的输入。
正如@Sergii Dmytrenko所建议的那样,你应该使用相对的XPath表达式。如果您需要一些东西来定位输入元素,您可以使用以下一个(3 个谓词(:
//input[@class="block full-width"][@autocomplete="off"][@type="text"]
查找一个填充 3 个属性条件(@class
、@autocomplete
、@type
(的输入元素。
如果需要加强它,可以添加"c168"条件。
//input[@class="block full-width"][@autocomplete="off"][@type="text"][contains(name(@*[1]),"c168") or contains(name(@*[2]),"c168") or contains(name(@*[3]),"c168") or contains(name(@*[4]),"c168")or contains(name(@*[5]),"c168") or contains(name(@*[6]),"c168")]
或者遵循您的第一个想法:
//jn-typeahead-reactive-occupations[contains(name(@*[1]),"c168") or contains(name(@*[2]),"c168") or contains(name(@*[3]),"c168") or contains(name(@*[4]),"c168")or contains(name(@*[5]),"c168") or contains(name(@*[6]),"c168")]/input
我终于找到了一个有效的解决方案,我只是使用 chrome 开发工具复制了整个 xpath:
browser.find_element_by_xpath("/html/body/div[6]/jn-root/jn-layout-main/section/main/article/jn-jobseeking-detail/jn-page/jn-form/form/jn-job/jn-details-container/div/fieldset/div/div[1]/jn-form-typeahead-occupations/div/jn-typeahead-reactive-occupations/input").send_keys('hello')
我希望这对其他人有用